blob: c2840564a9fe7c62a356121fd47c1936819acb52 [file] [log] [blame]
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001#include "Python.h"
2#include "cStringIO.h"
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003#include "structmember.h"
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005PyDoc_STRVAR(cPickle_module_documentation,
Tim Peters64c04d12003-02-01 06:27:59 +00006"C implementation and optimization of the Python pickle module.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00007
Guido van Rossum142eeb81997-08-13 03:14:41 +00008#ifndef Py_eval_input
9#include <graminit.h>
10#define Py_eval_input eval_input
Guido van Rossumc6ef2041997-08-21 02:30:45 +000011#endif /* Py_eval_input */
Guido van Rossum142eeb81997-08-13 03:14:41 +000012
Guido van Rossum60456fd1997-04-09 17:36:32 +000013#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000014
Guido van Rossum60456fd1997-04-09 17:36:32 +000015#define WRITE_BUF_SIZE 256
16
Tim Peters5bd2a792003-02-01 16:45:06 +000017/* Bump this when new opcodes are added to the pickle protocol. */
18#define CURRENT_PROTOCOL_NUMBER 2
19
Tim Peters797ec242003-02-01 06:22:36 +000020/*
21 * Pickle opcodes. These must be kept in synch with pickle.py. Extensive
22 * docs are in pickletools.py.
23 */
Guido van Rossum60456fd1997-04-09 17:36:32 +000024#define MARK '('
25#define STOP '.'
26#define POP '0'
27#define POP_MARK '1'
28#define DUP '2'
29#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000030#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000031#define INT 'I'
32#define BININT 'J'
33#define BININT1 'K'
34#define LONG 'L'
35#define BININT2 'M'
36#define NONE 'N'
37#define PERSID 'P'
38#define BINPERSID 'Q'
39#define REDUCE 'R'
40#define STRING 'S'
41#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +000042#define SHORT_BINSTRING 'U'
Guido van Rossum5fccb7c2000-03-10 23:11:40 +000043#define UNICODE 'V'
44#define BINUNICODE 'X'
Guido van Rossum60456fd1997-04-09 17:36:32 +000045#define APPEND 'a'
46#define BUILD 'b'
47#define GLOBAL 'c'
48#define DICT 'd'
49#define EMPTY_DICT '}'
50#define APPENDS 'e'
51#define GET 'g'
52#define BINGET 'h'
53#define INST 'i'
54#define LONG_BINGET 'j'
55#define LIST 'l'
56#define EMPTY_LIST ']'
57#define OBJ 'o'
58#define PUT 'p'
59#define BINPUT 'q'
60#define LONG_BINPUT 'r'
61#define SETITEM 's'
62#define TUPLE 't'
63#define EMPTY_TUPLE ')'
64#define SETITEMS 'u'
Tim Peters797ec242003-02-01 06:22:36 +000065
66/* Protocol 2. */
67#define PROTO '\x80' /* identify pickle protocol */
68#define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */
69#define EXT1 '\x82' /* push object from extension registry; 1-byte index */
70#define EXT2 '\x83' /* ditto, but 2-byte index */
71#define EXT4 '\x84' /* ditto, but 4-byte index */
72#define TUPLE1 '\x85' /* build 1-tuple from stack top */
73#define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */
74#define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */
75#define NEWTRUE '\x88' /* push True */
76#define NEWFALSE '\x89' /* push False */
77#define LONG1 '\x8a' /* push long from < 256 bytes */
78#define LONG4 '\x8b' /* push really big long */
79
80/* There aren't opcodes -- they're ways to pickle bools before protocol 2,
81 * so that unpicklers written before bools were introduced unpickle them
82 * as ints, but unpicklers after can recognize that bools were intended.
83 * Note that protocol 2 added direct ways to pickle bools.
84 */
Jack Jansen3a967022002-06-26 20:40:42 +000085#undef TRUE
Guido van Rossume2763392002-04-05 19:30:08 +000086#define TRUE "I01\n"
Jack Jansen3a967022002-06-26 20:40:42 +000087#undef FALSE
Guido van Rossume2763392002-04-05 19:30:08 +000088#define FALSE "I00\n"
Guido van Rossum77f6a652002-04-03 22:41:51 +000089
Guido van Rossum60456fd1997-04-09 17:36:32 +000090static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000091
Guido van Rossumc03158b1999-06-09 15:23:31 +000092static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000093static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +000094static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000095static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +000096static PyObject *BadPickleGet;
97
Guido van Rossum2f4caa41997-01-06 22:59:08 +000098
Guido van Rossum60456fd1997-04-09 17:36:32 +000099static PyObject *dispatch_table;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000100static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000101
Guido van Rossum60456fd1997-04-09 17:36:32 +0000102static PyObject *__class___str, *__getinitargs___str, *__dict___str,
103 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000104 *write_str, *append_str,
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000105 *read_str, *readline_str, *__main___str, *__basicnew___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000106 *copy_reg_str, *dispatch_table_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000107
Guido van Rossum053b8df1998-11-25 16:18:00 +0000108/*************************************************************************
109 Internal Data type for pickle data. */
110
111typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000112 PyObject_HEAD
113 int length, size;
114 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000115} Pdata;
116
Tim Peters84e87f32001-03-17 04:50:51 +0000117static void
Tim Peterscba30e22003-02-01 06:24:36 +0000118Pdata_dealloc(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000119{
120 int i;
121 PyObject **p;
Tim Peterscba30e22003-02-01 06:24:36 +0000122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000123 for (i=self->length, p=self->data; --i >= 0; p++) Py_DECREF(*p);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000125 if (self->data) free(self->data);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000127 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000128}
129
130static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000131 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
132 (destructor)Pdata_dealloc,
133 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000134};
135
136#define Pdata_Check(O) ((O)->ob_type == &PdataType)
137
138static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000139Pdata_New(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000140{
141 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000142
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000143 if (!( self = PyObject_New(Pdata, &PdataType))) return NULL;
144 self->size=8;
145 self->length=0;
146 self->data=malloc(self->size * sizeof(PyObject*));
147 if (self->data) return (PyObject*)self;
148 Py_DECREF(self);
149 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000150}
151
Tim Peters84e87f32001-03-17 04:50:51 +0000152static int
Tim Peterscba30e22003-02-01 06:24:36 +0000153stackUnderflow(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000154{
155 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
156 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000157}
158
159static int
Tim Peterscba30e22003-02-01 06:24:36 +0000160Pdata_clear(Pdata *self, int clearto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000161{
162 int i;
163 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000165 if (clearto < 0) return stackUnderflow();
166 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000168 for (i=self->length, p=self->data+clearto; --i >= clearto; p++)
169 Py_DECREF(*p);
170 self->length=clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000172 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000173}
174
175
Tim Peters84e87f32001-03-17 04:50:51 +0000176static int
Tim Peterscba30e22003-02-01 06:24:36 +0000177Pdata_grow(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000178{
179 if (! self->size) {
180 PyErr_NoMemory();
181 return -1;
182 }
183 self->size *= 2;
184 self->data = realloc(self->data, self->size*sizeof(PyObject*));
185 if (! self->data) {
186 self->size = 0;
187 PyErr_NoMemory();
188 return -1;
189 }
190 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +0000191}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000192
193#define PDATA_POP(D,V) { \
194 if ((D)->length) V=D->data[--((D)->length)]; \
195 else { \
196 PyErr_SetString(UnpicklingError, "bad pickle data"); \
197 V=NULL; \
198 } \
199}
200
201
202static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000203Pdata_popTuple(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000204{
205 PyObject *r;
206 int i, j, l;
Tim Peterscba30e22003-02-01 06:24:36 +0000207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000208 l=self->length-start;
209 if (!( r=PyTuple_New(l))) return NULL;
210 for (i=start, j=0 ; j < l; i++, j++)
211 PyTuple_SET_ITEM(r, j, self->data[i]);
Tim Peterscba30e22003-02-01 06:24:36 +0000212
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000213 self->length=start;
214 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000215}
216
217static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000218Pdata_popList(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000219{
220 PyObject *r;
221 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000222
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000223 l=self->length-start;
224 if (!( r=PyList_New(l))) return NULL;
225 for (i=start, j=0 ; j < l; i++, j++)
226 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000227
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000228 self->length=start;
229 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000230}
231
Guido van Rossum053b8df1998-11-25 16:18:00 +0000232#define PDATA_APPEND(D,O,ER) { \
233 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
234 Pdata_grow((Pdata*)(D)) < 0) \
235 return ER; \
236 Py_INCREF(O); \
237 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
238}
239
240#define PDATA_PUSH(D,O,ER) { \
241 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
242 Pdata_grow((Pdata*)(D)) < 0) { \
243 Py_DECREF(O); \
244 return ER; \
245 } \
246 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
247}
248
249/*************************************************************************/
250
251#define ARG_TUP(self, o) { \
252 if (self->arg || (self->arg=PyTuple_New(1))) { \
253 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
254 PyTuple_SET_ITEM(self->arg,0,o); \
255 } \
256 else { \
257 Py_DECREF(o); \
258 } \
259}
260
261#define FREE_ARG_TUP(self) { \
262 if (self->arg->ob_refcnt > 1) { \
263 Py_DECREF(self->arg); \
264 self->arg=NULL; \
265 } \
266 }
267
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000268typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000269 PyObject_HEAD
270 FILE *fp;
271 PyObject *write;
272 PyObject *file;
273 PyObject *memo;
274 PyObject *arg;
275 PyObject *pers_func;
276 PyObject *inst_pers_func;
Tim Peters797ec242003-02-01 06:22:36 +0000277
278 /* pickle protocol number, >= 0 */
279 int proto;
280
281 /* bool, true if proto > 0 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000282 int bin;
Tim Peters797ec242003-02-01 06:22:36 +0000283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000284 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis5a395302002-08-04 08:20:23 +0000285 int nesting;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000286 int (*write_func)(struct Picklerobject *, char *, int);
287 char *write_buf;
288 int buf_size;
289 PyObject *dispatch_table;
290 int fast_container; /* count nested container dumps */
291 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000292} Picklerobject;
293
Barry Warsaw52acb492001-12-21 20:04:22 +0000294#ifndef PY_CPICKLE_FAST_LIMIT
295#define PY_CPICKLE_FAST_LIMIT 50
296#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000297
Jeremy Hylton938ace62002-07-17 16:30:39 +0000298static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000299
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000300typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000301 PyObject_HEAD
302 FILE *fp;
303 PyObject *file;
304 PyObject *readline;
305 PyObject *read;
306 PyObject *memo;
307 PyObject *arg;
308 Pdata *stack;
309 PyObject *mark;
310 PyObject *pers_func;
311 PyObject *last_string;
312 int *marks;
313 int num_marks;
314 int marks_size;
315 int (*read_func)(struct Unpicklerobject *, char **, int);
316 int (*readline_func)(struct Unpicklerobject *, char **);
317 int buf_size;
318 char *buf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000319 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000320} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000321
Jeremy Hylton938ace62002-07-17 16:30:39 +0000322static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000323
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000324/* Forward decls that need the above structs */
325static int save(Picklerobject *, PyObject *, int);
326static int put2(Picklerobject *, PyObject *);
327
Tim Peters84e87f32001-03-17 04:50:51 +0000328int
Tim Peterscba30e22003-02-01 06:24:36 +0000329cPickle_PyMapping_HasKey(PyObject *o, PyObject *key)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000330{
331 PyObject *v;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000332
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000333 if ((v = PyObject_GetItem(o,key))) {
334 Py_DECREF(v);
335 return 1;
336 }
Tim Peterscba30e22003-02-01 06:24:36 +0000337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000338 PyErr_Clear();
339 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000340}
341
Guido van Rossumd385d591997-04-09 17:47:47 +0000342static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000343PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000344cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
345{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000346 va_list va;
347 PyObject *args=0, *retval=0;
348 va_start(va, format);
Tim Peterscba30e22003-02-01 06:24:36 +0000349
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000350 if (format) args = Py_VaBuildValue(format, va);
351 va_end(va);
352 if (format && ! args) return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000353 if (stringformat && !(retval=PyString_FromString(stringformat)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000354 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000355
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000356 if (retval) {
357 if (args) {
358 PyObject *v;
359 v=PyString_Format(retval, args);
360 Py_DECREF(retval);
361 Py_DECREF(args);
362 if (! v) return NULL;
363 retval=v;
364 }
365 }
366 else
367 if (args) retval=args;
368 else {
369 PyErr_SetObject(ErrType,Py_None);
370 return NULL;
371 }
372 PyErr_SetObject(ErrType,retval);
373 Py_DECREF(retval);
374 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000375}
376
Tim Peters84e87f32001-03-17 04:50:51 +0000377static int
Tim Peterscba30e22003-02-01 06:24:36 +0000378write_file(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000379{
380 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000382 if (s == NULL) {
383 return 0;
384 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000386 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000387 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000388 Py_END_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000389 if (nbyteswritten != (size_t)n) {
390 PyErr_SetFromErrno(PyExc_IOError);
391 return -1;
392 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000393
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000394 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000395}
396
Tim Peters84e87f32001-03-17 04:50:51 +0000397static int
Tim Peterscba30e22003-02-01 06:24:36 +0000398write_cStringIO(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000399{
400 if (s == NULL) {
401 return 0;
402 }
Tim Peterscba30e22003-02-01 06:24:36 +0000403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000404 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
405 return -1;
406 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000408 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000409}
410
Tim Peters84e87f32001-03-17 04:50:51 +0000411static int
Tim Peterscba30e22003-02-01 06:24:36 +0000412write_none(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000413{
414 if (s == NULL) return 0;
415 return n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000416}
417
Tim Peters84e87f32001-03-17 04:50:51 +0000418static int
Tim Peterscba30e22003-02-01 06:24:36 +0000419write_other(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000420{
421 PyObject *py_str = 0, *junk = 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000423 if (s == NULL) {
424 if (!( self->buf_size )) return 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000425 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000426 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000427 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000428 return -1;
429 }
430 else {
431 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
432 if (write_other(self, NULL, 0) < 0)
433 return -1;
434 }
Tim Peterscba30e22003-02-01 06:24:36 +0000435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000436 if (n > WRITE_BUF_SIZE) {
437 if (!( py_str =
Tim Peterscba30e22003-02-01 06:24:36 +0000438 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000439 return -1;
440 }
441 else {
442 memcpy(self->write_buf + self->buf_size, s, n);
443 self->buf_size += n;
444 return n;
445 }
446 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000448 if (self->write) {
449 /* object with write method */
450 ARG_TUP(self, py_str);
451 if (self->arg) {
452 junk = PyObject_Call(self->write, self->arg, NULL);
453 FREE_ARG_TUP(self);
454 }
455 if (junk) Py_DECREF(junk);
456 else return -1;
457 }
458 else
459 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000461 self->buf_size = 0;
462 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000463}
464
465
Tim Peters84e87f32001-03-17 04:50:51 +0000466static int
Tim Petersee1a53c2003-02-02 02:57:53 +0000467read_file(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000468{
469 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000470
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000471 if (self->buf_size == 0) {
472 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000474 size = ((n < 32) ? 32 : n);
Tim Petersee1a53c2003-02-02 02:57:53 +0000475 if (!( self->buf = (char *)malloc(size))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000476 PyErr_NoMemory();
477 return -1;
478 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000479
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000480 self->buf_size = size;
481 }
482 else if (n > self->buf_size) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000483 self->buf = (char *)realloc(self->buf, n);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000484 if (!self->buf) {
485 PyErr_NoMemory();
486 return -1;
487 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000488 self->buf_size = n;
489 }
Tim Peters84e87f32001-03-17 04:50:51 +0000490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000491 Py_BEGIN_ALLOW_THREADS
492 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
493 Py_END_ALLOW_THREADS
494 if (nbytesread != (size_t)n) {
495 if (feof(self->fp)) {
496 PyErr_SetNone(PyExc_EOFError);
497 return -1;
498 }
Tim Peterscba30e22003-02-01 06:24:36 +0000499
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000500 PyErr_SetFromErrno(PyExc_IOError);
501 return -1;
502 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000503
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000504 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000506 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000507}
508
509
Tim Peters84e87f32001-03-17 04:50:51 +0000510static int
Tim Peterscba30e22003-02-01 06:24:36 +0000511readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000512{
513 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000515 if (self->buf_size == 0) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000516 if (!( self->buf = (char *)malloc(40))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000517 PyErr_NoMemory();
518 return -1;
519 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000520 self->buf_size = 40;
521 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000523 i = 0;
524 while (1) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000525 int bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000526 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000527 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000528 (self->buf[i] = getc(self->fp)) == '\n') {
529 self->buf[i + 1] = '\0';
530 *s = self->buf;
531 return i + 1;
532 }
533 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000534 bigger = self->buf_size << 1;
535 if (bigger <= 0) { /* overflow */
536 PyErr_NoMemory();
537 return -1;
538 }
539 self->buf = (char *)realloc(self->buf, bigger);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000540 if (!self->buf) {
541 PyErr_NoMemory();
542 return -1;
543 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000544 self->buf_size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000545 }
Tim Peters84e87f32001-03-17 04:50:51 +0000546}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000547
548
Tim Peters84e87f32001-03-17 04:50:51 +0000549static int
Tim Peterscba30e22003-02-01 06:24:36 +0000550read_cStringIO(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000551{
552 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000554 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
555 PyErr_SetNone(PyExc_EOFError);
556 return -1;
557 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000558
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000559 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000561 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000562}
563
564
Tim Peters84e87f32001-03-17 04:50:51 +0000565static int
Tim Peterscba30e22003-02-01 06:24:36 +0000566readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000567{
568 int n;
569 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000571 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
572 return -1;
573 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000575 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000577 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000578}
579
580
Tim Peters84e87f32001-03-17 04:50:51 +0000581static int
Tim Peterscba30e22003-02-01 06:24:36 +0000582read_other(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000583{
584 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000585
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000586 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000588 ARG_TUP(self, bytes);
589 if (self->arg) {
590 str = PyObject_Call(self->read, self->arg, NULL);
591 FREE_ARG_TUP(self);
592 }
593 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000594
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000595 Py_XDECREF(self->last_string);
596 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000598 if (! (*s = PyString_AsString(str))) return -1;
599 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000600}
601
602
Tim Peters84e87f32001-03-17 04:50:51 +0000603static int
Tim Peterscba30e22003-02-01 06:24:36 +0000604readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000605{
606 PyObject *str;
607 int str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000609 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
610 return -1;
611 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000613 if ((str_size = PyString_Size(str)) < 0)
614 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000615
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000616 Py_XDECREF(self->last_string);
617 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000619 if (! (*s = PyString_AsString(str)))
620 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000622 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000623}
624
Tim Petersee1a53c2003-02-02 02:57:53 +0000625/* Copy the first n bytes from s into newly malloc'ed memory, plus a
626 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
627 * The caller is responsible for free()'ing the return value.
628 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000629static char *
Tim Petersee1a53c2003-02-02 02:57:53 +0000630pystrndup(char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000631{
Tim Petersee1a53c2003-02-02 02:57:53 +0000632 char *r = (char *)malloc(n+1);
633 if (r == NULL)
634 return (char*)PyErr_NoMemory();
635 memcpy(r, s, n);
636 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000637 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000638}
639
640
641static int
Tim Peterscba30e22003-02-01 06:24:36 +0000642get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000643{
644 PyObject *value, *mv;
645 long c_value;
646 char s[30];
647 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000648
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000649 if (!( mv = PyDict_GetItem(self->memo, id))) {
650 PyErr_SetObject(PyExc_KeyError, id);
651 return -1;
652 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000653
Tim Peterscba30e22003-02-01 06:24:36 +0000654 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000655 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000657 if (!( PyInt_Check(value))) {
658 PyErr_SetString(PicklingError, "no int where int expected in memo");
659 return -1;
660 }
661 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000662
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000663 if (!self->bin) {
664 s[0] = GET;
665 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
666 len = strlen(s);
667 }
668 else if (Pdata_Check(self->file)) {
669 if (write_other(self, NULL, 0) < 0) return -1;
670 PDATA_APPEND(self->file, mv, -1);
671 return 0;
672 }
673 else {
674 if (c_value < 256) {
675 s[0] = BINGET;
676 s[1] = (int)(c_value & 0xff);
677 len = 2;
678 }
679 else {
680 s[0] = LONG_BINGET;
681 s[1] = (int)(c_value & 0xff);
682 s[2] = (int)((c_value >> 8) & 0xff);
683 s[3] = (int)((c_value >> 16) & 0xff);
684 s[4] = (int)((c_value >> 24) & 0xff);
685 len = 5;
686 }
687 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000689 if ((*self->write_func)(self, s, len) < 0)
690 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000691
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000692 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000693}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000694
Guido van Rossum60456fd1997-04-09 17:36:32 +0000695
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000696static int
Tim Peterscba30e22003-02-01 06:24:36 +0000697put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000698{
Tim Peterscba30e22003-02-01 06:24:36 +0000699 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000700 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000702 return put2(self, ob);
703}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000704
Guido van Rossum053b8df1998-11-25 16:18:00 +0000705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000706static int
Tim Peterscba30e22003-02-01 06:24:36 +0000707put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000708{
709 char c_str[30];
710 int p;
711 size_t len;
712 int res = -1;
713 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000715 if (self->fast)
716 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000718 if ((p = PyDict_Size(self->memo)) < 0)
719 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000721 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000722 /* XXX Why?
723 * XXX And does "positive" really mean non-negative?
724 * XXX pickle.py starts with PUT index 0, not 1. This makes for
725 * XXX gratuitous differences between the pickling modules.
726 */
Tim Peterscba30e22003-02-01 06:24:36 +0000727 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000728
Tim Peterscba30e22003-02-01 06:24:36 +0000729 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000730 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000731
Tim Peterscba30e22003-02-01 06:24:36 +0000732 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000733 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000734
Tim Peterscba30e22003-02-01 06:24:36 +0000735 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000736 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000738 PyTuple_SET_ITEM(t, 0, memo_len);
739 Py_INCREF(memo_len);
740 PyTuple_SET_ITEM(t, 1, ob);
741 Py_INCREF(ob);
742
743 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
744 goto finally;
745
746 if (!self->bin) {
747 c_str[0] = PUT;
748 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
749 len = strlen(c_str);
750 }
751 else if (Pdata_Check(self->file)) {
752 if (write_other(self, NULL, 0) < 0) return -1;
753 PDATA_APPEND(self->file, memo_len, -1);
754 res=0; /* Job well done ;) */
755 goto finally;
756 }
757 else {
758 if (p >= 256) {
759 c_str[0] = LONG_BINPUT;
760 c_str[1] = (int)(p & 0xff);
761 c_str[2] = (int)((p >> 8) & 0xff);
762 c_str[3] = (int)((p >> 16) & 0xff);
763 c_str[4] = (int)((p >> 24) & 0xff);
764 len = 5;
765 }
766 else {
767 c_str[0] = BINPUT;
768 c_str[1] = p;
769 len = 2;
770 }
771 }
772
773 if ((*self->write_func)(self, c_str, len) < 0)
774 goto finally;
775
776 res = 0;
777
778 finally:
779 Py_XDECREF(py_ob_id);
780 Py_XDECREF(memo_len);
781 Py_XDECREF(t);
782
783 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000784}
785
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000786#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000787
788static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000789PyImport_Import(PyObject *module_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000790{
791 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
792 static PyObject *standard_builtins=0;
793 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000795 if (!( silly_list )) {
Tim Peterscba30e22003-02-01 06:24:36 +0000796 if (!( __import___str=PyString_FromString("__import__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000797 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000798 if (!( __builtins___str=PyString_FromString("__builtins__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000799 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000800 if (!( silly_list=Py_BuildValue("[s]","__doc__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000801 return NULL;
802 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000804 if ((globals=PyEval_GetGlobals())) {
805 Py_INCREF(globals);
806 __builtins__=PyObject_GetItem(globals,__builtins___str);
Tim Peterscba30e22003-02-01 06:24:36 +0000807 if (!__builtins__)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000808 goto err;
809 }
810 else {
811 PyErr_Clear();
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000813 if (!(standard_builtins ||
Tim Peterscba30e22003-02-01 06:24:36 +0000814 (standard_builtins=PyImport_ImportModule("__builtin__"))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000815 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000817 __builtins__=standard_builtins;
818 Py_INCREF(__builtins__);
819 globals = Py_BuildValue("{sO}", "__builtins__", __builtins__);
Tim Peterscba30e22003-02-01 06:24:36 +0000820 if (!globals)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000821 goto err;
822 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000824 if (PyDict_Check(__builtins__)) {
825 __import__=PyObject_GetItem(__builtins__,__import___str);
826 if (!__import__) goto err;
827 }
828 else {
829 __import__=PyObject_GetAttr(__builtins__,__import___str);
830 if (!__import__) goto err;
831 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000833 r=PyObject_CallFunction(__import__,"OOOO",
834 module_name, globals, globals, silly_list);
Tim Peterscba30e22003-02-01 06:24:36 +0000835 if (!r)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000836 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000837
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000838 Py_DECREF(globals);
839 Py_DECREF(__builtins__);
840 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000842 return r;
843 err:
844 Py_XDECREF(globals);
845 Py_XDECREF(__builtins__);
846 Py_XDECREF(__import__);
847 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000848}
849
850static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000851whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000852{
853 int i, j;
854 PyObject *module = 0, *modules_dict = 0,
855 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000857 module = PyObject_GetAttrString(global, "__module__");
858 if (module) return module;
859 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000860
Tim Peterscba30e22003-02-01 06:24:36 +0000861 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000862 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000864 i = 0;
865 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000867 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000869 global_name_attr = PyObject_GetAttr(module, global_name);
870 if (!global_name_attr) {
871 PyErr_Clear();
872 continue;
873 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000874
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000875 if (global_name_attr != global) {
876 Py_DECREF(global_name_attr);
877 continue;
878 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000880 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000882 break;
883 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000884
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000885 /* The following implements the rule in pickle.py added in 1.5
886 that used __main__ if no module is found. I don't actually
887 like this rule. jlf
888 */
889 if (!j) {
890 j=1;
891 name=__main___str;
892 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000894 Py_INCREF(name);
895 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000896}
897
898
Guido van Rossum60456fd1997-04-09 17:36:32 +0000899static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000900fast_save_enter(Picklerobject *self, PyObject *obj)
901{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000902 /* if fast_container < 0, we're doing an error exit. */
903 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
904 PyObject *key = NULL;
905 if (self->fast_memo == NULL) {
906 self->fast_memo = PyDict_New();
907 if (self->fast_memo == NULL) {
908 self->fast_container = -1;
909 return 0;
910 }
911 }
912 key = PyLong_FromVoidPtr(obj);
913 if (key == NULL)
914 return 0;
915 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000916 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000917 PyErr_Format(PyExc_ValueError,
918 "fast mode: can't pickle cyclic objects including object type %s at %p",
919 obj->ob_type->tp_name, obj);
920 self->fast_container = -1;
921 return 0;
922 }
923 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000924 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000925 self->fast_container = -1;
926 return 0;
927 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000928 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000929 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000930 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000931}
932
Tim Peterscba30e22003-02-01 06:24:36 +0000933int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000934fast_save_leave(Picklerobject *self, PyObject *obj)
935{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000936 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
937 PyObject *key = PyLong_FromVoidPtr(obj);
938 if (key == NULL)
939 return 0;
940 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000941 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000942 return 0;
943 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000944 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000945 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000946 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000947}
948
949static int
Tim Peterscba30e22003-02-01 06:24:36 +0000950save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000951{
952 static char none = NONE;
953 if ((*self->write_func)(self, &none, 1) < 0)
954 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000955
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000956 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000957}
958
Guido van Rossum77f6a652002-04-03 22:41:51 +0000959static int
Tim Peterscba30e22003-02-01 06:24:36 +0000960save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000961{
Guido van Rossume2763392002-04-05 19:30:08 +0000962 static char *buf[2] = {FALSE, TRUE};
963 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000964 long l = PyInt_AS_LONG((PyIntObject *)args);
965
Guido van Rossume2763392002-04-05 19:30:08 +0000966 if ((*self->write_func)(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000967 return -1;
968
969 return 0;
970}
Tim Peters84e87f32001-03-17 04:50:51 +0000971
Guido van Rossum60456fd1997-04-09 17:36:32 +0000972static int
Tim Peterscba30e22003-02-01 06:24:36 +0000973save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000974{
975 char c_str[32];
976 long l = PyInt_AS_LONG((PyIntObject *)args);
977 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000978
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000979 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000980#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000981 || l > 0x7fffffffL
982 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000983#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000984 ) {
985 /* Text-mode pickle, or long too big to fit in the 4-byte
986 * signed BININT format: store as a string.
987 */
988 c_str[0] = INT;
989 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
990 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
991 return -1;
992 }
993 else {
994 /* Binary pickle and l fits in a signed 4-byte int. */
995 c_str[1] = (int)( l & 0xff);
996 c_str[2] = (int)((l >> 8) & 0xff);
997 c_str[3] = (int)((l >> 16) & 0xff);
998 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000999
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001000 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1001 if (c_str[2] == 0) {
1002 c_str[0] = BININT1;
1003 len = 2;
1004 }
1005 else {
1006 c_str[0] = BININT2;
1007 len = 3;
1008 }
1009 }
1010 else {
1011 c_str[0] = BININT;
1012 len = 5;
1013 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001014
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001015 if ((*self->write_func)(self, c_str, len) < 0)
1016 return -1;
1017 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001018
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001019 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001020}
1021
1022
1023static int
Tim Peterscba30e22003-02-01 06:24:36 +00001024save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001025{
Tim Petersee1a53c2003-02-02 02:57:53 +00001026 int size;
1027 int res = -1;
1028 PyObject *repr = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001029
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001030 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001031
Tim Petersee1a53c2003-02-02 02:57:53 +00001032 if (self->proto >= 2) {
1033 /* Linear-time pickling. */
1034 size_t nbits;
1035 size_t nbytes;
1036 unsigned char *pdata;
1037 char c_str[5];
1038 int i;
1039 int sign = _PyLong_Sign(args);
1040
1041 if (sign == 0) {
1042 /* It's 0 -- an empty bytestring. */
1043 c_str[0] = LONG1;
1044 c_str[1] = 0;
1045 i = self->write_func(self, c_str, 2);
1046 if (i < 0) goto finally;
1047 res = 0;
1048 goto finally;
1049 }
1050 nbits = _PyLong_NumBits(args);
1051 if (nbits == (size_t)-1 && PyErr_Occurred())
1052 goto finally;
1053 /* How many bytes do we need? There are nbits >> 3 full
1054 * bytes of data, and nbits & 7 leftover bits. If there
1055 * are any leftover bits, then we clearly need another
1056 * byte. Wnat's not so obvious is that we *probably*
1057 * need another byte even if there aren't any leftovers:
1058 * the most-significant bit of the most-significant byte
1059 * acts like a sign bit, and it's usually got a sense
1060 * opposite of the one we need. The exception is longs
1061 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1062 * its own 256's-complement, so has the right sign bit
1063 * even without the extra byte. That's a pain to check
1064 * for in advance, though, so we always grab an extra
1065 * byte at the start, and cut it back later if possible.
1066 */
1067 nbytes = (nbits >> 3) + 1;
1068 if ((int)nbytes < 0 || (size_t)(int)nbytes != nbytes) {
1069 PyErr_SetString(PyExc_OverflowError, "long too large "
1070 "to pickle");
1071 goto finally;
1072 }
1073 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
1074 if (repr == NULL) goto finally;
1075 pdata = (unsigned char *)PyString_AS_STRING(repr);
1076 i = _PyLong_AsByteArray((PyLongObject *)args,
1077 pdata, nbytes,
1078 1 /* little endian */, 1 /* signed */);
1079 if (i < 0) goto finally;
1080 /* If the long is negative, this may be a byte more than
1081 * needed. This is so iff the MSB is all redundant sign
1082 * bits.
1083 */
1084 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1085 (pdata[nbytes - 2] & 0x80) != 0)
1086 --nbytes;
1087
1088 if (nbytes < 256) {
1089 c_str[0] = LONG1;
1090 c_str[1] = (char)nbytes;
1091 size = 2;
1092 }
1093 else {
1094 c_str[0] = LONG4;
1095 size = (int)nbytes;
1096 for (i = 1; i < 5; i++) {
1097 c_str[i] = (char)(size & 0xff);
1098 size >>= 8;
1099 }
1100 size = 5;
1101 }
1102 i = self->write_func(self, c_str, size);
1103 if (i < 0) goto finally;
1104 i = self->write_func(self, (char *)pdata, (int)nbytes);
1105 if (i < 0) goto finally;
1106 res = 0;
1107 goto finally;
1108 }
1109
1110 /* proto < 2: write the repr and newline. This is quadratic-time
1111 * (in the number of digits), in both directions.
1112 */
Tim Peterscba30e22003-02-01 06:24:36 +00001113 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001114 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001116 if ((size = PyString_Size(repr)) < 0)
1117 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001119 if ((*self->write_func)(self, &l, 1) < 0)
1120 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001122 if ((*self->write_func)(self,
Tim Peterscba30e22003-02-01 06:24:36 +00001123 PyString_AS_STRING((PyStringObject *)repr),
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001124 size) < 0)
1125 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001127 if ((*self->write_func)(self, "\n", 1) < 0)
1128 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001129
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001130 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001132 finally:
1133 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001134 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001135}
1136
1137
1138static int
Tim Peterscba30e22003-02-01 06:24:36 +00001139save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001140{
1141 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001142
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001143 if (self->bin) {
1144 int s, e;
1145 double f;
1146 long fhi, flo;
1147 char str[9];
1148 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001149
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001150 *p = BINFLOAT;
1151 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001153 if (x < 0) {
1154 s = 1;
1155 x = -x;
1156 }
1157 else
1158 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001160 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001162 /* Normalize f to be in the range [1.0, 2.0) */
1163 if (0.5 <= f && f < 1.0) {
1164 f *= 2.0;
1165 e--;
1166 }
1167 else if (f == 0.0) {
1168 e = 0;
1169 }
1170 else {
1171 PyErr_SetString(PyExc_SystemError,
1172 "frexp() result out of range");
1173 return -1;
1174 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001175
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001176 if (e >= 1024) {
1177 /* XXX 1024 itself is reserved for Inf/NaN */
1178 PyErr_SetString(PyExc_OverflowError,
1179 "float too large to pack with d format");
1180 return -1;
1181 }
1182 else if (e < -1022) {
1183 /* Gradual underflow */
1184 f = ldexp(f, 1022 + e);
1185 e = 0;
1186 }
1187 else if (!(e == 0 && f == 0.0)) {
1188 e += 1023;
1189 f -= 1.0; /* Get rid of leading 1 */
1190 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001191
Tim Peterscba30e22003-02-01 06:24:36 +00001192 /* fhi receives the high 28 bits;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001193 flo the low 24 bits (== 52 bits) */
1194 f *= 268435456.0; /* 2**28 */
1195 fhi = (long) floor(f); /* Truncate */
1196 f -= (double)fhi;
1197 f *= 16777216.0; /* 2**24 */
1198 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001200 /* First byte */
1201 *p = (s<<7) | (e>>4);
1202 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001204 /* Second byte */
1205 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1206 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001208 /* Third byte */
1209 *p = (unsigned char) ((fhi>>16) & 0xFF);
1210 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001212 /* Fourth byte */
1213 *p = (unsigned char) ((fhi>>8) & 0xFF);
1214 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001216 /* Fifth byte */
1217 *p = (unsigned char) (fhi & 0xFF);
1218 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001220 /* Sixth byte */
1221 *p = (unsigned char) ((flo>>16) & 0xFF);
1222 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001223
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001224 /* Seventh byte */
1225 *p = (unsigned char) ((flo>>8) & 0xFF);
1226 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001227
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001228 /* Eighth byte */
1229 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001230
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001231 if ((*self->write_func)(self, str, 9) < 0)
1232 return -1;
1233 }
1234 else {
1235 char c_str[250];
1236 c_str[0] = FLOAT;
1237 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001239 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1240 return -1;
1241 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001243 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001244}
1245
1246
1247static int
Tim Peterscba30e22003-02-01 06:24:36 +00001248save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001249{
1250 int size, len;
1251 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001252
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001253 if ((size = PyString_Size(args)) < 0)
1254 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001255
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001256 if (!self->bin) {
1257 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001259 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001260
Tim Peterscba30e22003-02-01 06:24:36 +00001261 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001262 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001263
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001264 if ((len = PyString_Size(repr)) < 0)
1265 goto err;
1266 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001268 if ((*self->write_func)(self, &string, 1) < 0)
1269 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001270
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001271 if ((*self->write_func)(self, repr_str, len) < 0)
1272 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001273
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001274 if ((*self->write_func)(self, "\n", 1) < 0)
1275 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001276
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001277 Py_XDECREF(repr);
1278 }
1279 else {
1280 int i;
1281 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001282
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001283 if ((size = PyString_Size(args)) < 0)
1284 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001285
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001286 if (size < 256) {
1287 c_str[0] = SHORT_BINSTRING;
1288 c_str[1] = size;
1289 len = 2;
1290 }
1291 else {
1292 c_str[0] = BINSTRING;
1293 for (i = 1; i < 5; i++)
1294 c_str[i] = (int)(size >> ((i - 1) * 8));
1295 len = 5;
1296 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001297
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001298 if ((*self->write_func)(self, c_str, len) < 0)
1299 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001300
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001301 if (size > 128 && Pdata_Check(self->file)) {
1302 if (write_other(self, NULL, 0) < 0) return -1;
1303 PDATA_APPEND(self->file, args, -1);
1304 }
1305 else {
1306 if ((*self->write_func)(self,
1307 PyString_AS_STRING((PyStringObject *)args), size) < 0)
1308 return -1;
1309 }
1310 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001311
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001312 if (doput)
1313 if (put(self, args) < 0)
1314 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001315
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001316 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001317
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001318 err:
1319 Py_XDECREF(repr);
1320 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001321}
1322
1323
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001324#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001325/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1326 backslash and newline characters to \uXXXX escapes. */
1327static PyObject *
1328modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1329{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001330 PyObject *repr;
1331 char *p;
1332 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001333
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001334 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001336 repr = PyString_FromStringAndSize(NULL, 6 * size);
1337 if (repr == NULL)
1338 return NULL;
1339 if (size == 0)
1340 return repr;
1341
1342 p = q = PyString_AS_STRING(repr);
1343 while (size-- > 0) {
1344 Py_UNICODE ch = *s++;
1345 /* Map 16-bit characters to '\uxxxx' */
1346 if (ch >= 256 || ch == '\\' || ch == '\n') {
1347 *p++ = '\\';
1348 *p++ = 'u';
1349 *p++ = hexdigit[(ch >> 12) & 0xf];
1350 *p++ = hexdigit[(ch >> 8) & 0xf];
1351 *p++ = hexdigit[(ch >> 4) & 0xf];
1352 *p++ = hexdigit[ch & 15];
1353 }
1354 /* Copy everything else as-is */
1355 else
1356 *p++ = (char) ch;
1357 }
1358 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001359 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001360 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001361}
1362
1363
Guido van Rossum60456fd1997-04-09 17:36:32 +00001364static int
Tim Peterscba30e22003-02-01 06:24:36 +00001365save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001366{
1367 int size, len;
1368 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001369
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001370 if (!PyUnicode_Check(args))
1371 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001372
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001373 if (!self->bin) {
1374 char *repr_str;
1375 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001377 repr = modified_EncodeRawUnicodeEscape(
1378 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001379 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001380 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001382 if ((len = PyString_Size(repr)) < 0)
1383 goto err;
1384 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001386 if ((*self->write_func)(self, &string, 1) < 0)
1387 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001389 if ((*self->write_func)(self, repr_str, len) < 0)
1390 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001391
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001392 if ((*self->write_func)(self, "\n", 1) < 0)
1393 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001395 Py_XDECREF(repr);
1396 }
1397 else {
1398 int i;
1399 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001400
Tim Peterscba30e22003-02-01 06:24:36 +00001401 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001402 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001404 if ((size = PyString_Size(repr)) < 0)
1405 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001407 c_str[0] = BINUNICODE;
1408 for (i = 1; i < 5; i++)
1409 c_str[i] = (int)(size >> ((i - 1) * 8));
1410 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001411
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001412 if ((*self->write_func)(self, c_str, len) < 0)
1413 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001414
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001415 if (size > 128 && Pdata_Check(self->file)) {
1416 if (write_other(self, NULL, 0) < 0)
1417 goto err;
1418 PDATA_APPEND(self->file, repr, -1);
1419 }
1420 else {
1421 if ((*self->write_func)(self, PyString_AS_STRING(repr),
1422 size) < 0)
1423 goto err;
1424 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001425
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001426 Py_DECREF(repr);
1427 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001428
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001429 if (doput)
1430 if (put(self, args) < 0)
1431 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001433 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001434
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001435 err:
1436 Py_XDECREF(repr);
1437 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001438}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001439#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001440
1441
1442static int
Tim Peterscba30e22003-02-01 06:24:36 +00001443save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001444{
1445 PyObject *element = 0, *py_tuple_id = 0;
1446 int len, i, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001448 static char tuple = TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001450 if ((*self->write_func)(self, &MARKv, 1) < 0)
1451 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001452
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001453 if ((len = PyTuple_Size(args)) < 0)
1454 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001455
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001456 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001457 if (!( element = PyTuple_GET_ITEM((PyTupleObject *)args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001458 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001460 if (save(self, element, 0) < 0)
1461 goto finally;
1462 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001463
Tim Peterscba30e22003-02-01 06:24:36 +00001464 if (!( py_tuple_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001465 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001466
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001467 if (len) {
1468 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1469 if (self->bin) {
1470 static char pop_mark = POP_MARK;
Tim Peters84e87f32001-03-17 04:50:51 +00001471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001472 if ((*self->write_func)(self, &pop_mark, 1) < 0)
1473 goto finally;
1474 }
1475 else {
1476 static char pop = POP;
Tim Peters84e87f32001-03-17 04:50:51 +00001477
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001478 for (i = 0; i <= len; i++) {
1479 if ((*self->write_func)(self, &pop, 1) < 0)
1480 goto finally;
1481 }
1482 }
Tim Peters84e87f32001-03-17 04:50:51 +00001483
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001484 if (get(self, py_tuple_id) < 0)
1485 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001487 res = 0;
1488 goto finally;
1489 }
1490 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001492 if ((*self->write_func)(self, &tuple, 1) < 0) {
1493 goto finally;
1494 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001496 if (put(self, args) < 0)
1497 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001499 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001501 finally:
1502 Py_XDECREF(py_tuple_id);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001503
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001504 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001505}
1506
1507static int
Tim Peterscba30e22003-02-01 06:24:36 +00001508save_empty_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001509{
1510 static char tuple = EMPTY_TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001512 return (*self->write_func)(self, &tuple, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001513}
1514
1515
1516static int
Tim Peterscba30e22003-02-01 06:24:36 +00001517save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001518{
1519 PyObject *element = 0;
1520 int s_len, len, i, using_appends, res = -1;
1521 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001523 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001525 if (self->fast && !fast_save_enter(self, args))
1526 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001527
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001528 if (self->bin) {
1529 s[0] = EMPTY_LIST;
1530 s_len = 1;
1531 }
1532 else {
1533 s[0] = MARK;
1534 s[1] = LIST;
1535 s_len = 2;
1536 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001537
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001538 if ((len = PyList_Size(args)) < 0)
1539 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001540
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001541 if ((*self->write_func)(self, s, s_len) < 0)
1542 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001544 if (len == 0) {
1545 if (put(self, args) < 0)
1546 goto finally;
1547 }
1548 else {
1549 if (put2(self, args) < 0)
1550 goto finally;
1551 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001552
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001553 if ((using_appends = (self->bin && (len > 1))))
1554 if ((*self->write_func)(self, &MARKv, 1) < 0)
1555 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001557 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001558 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001559 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001561 if (save(self, element, 0) < 0)
1562 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001564 if (!using_appends) {
1565 if ((*self->write_func)(self, &append, 1) < 0)
1566 goto finally;
1567 }
1568 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001569
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001570 if (using_appends) {
1571 if ((*self->write_func)(self, &appends, 1) < 0)
1572 goto finally;
1573 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001575 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001577 finally:
1578 if (self->fast && !fast_save_leave(self, args))
1579 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001581 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001582}
1583
1584
Guido van Rossum60456fd1997-04-09 17:36:32 +00001585static int
Tim Peterscba30e22003-02-01 06:24:36 +00001586save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001587{
1588 PyObject *key = 0, *value = 0;
1589 int i, len, res = -1, using_setitems;
1590 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001592 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001593
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001594 if (self->fast && !fast_save_enter(self, args))
1595 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001596
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001597 if (self->bin) {
1598 s[0] = EMPTY_DICT;
1599 len = 1;
1600 }
1601 else {
1602 s[0] = MARK;
1603 s[1] = DICT;
1604 len = 2;
1605 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001607 if ((*self->write_func)(self, s, len) < 0)
1608 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001610 if ((len = PyDict_Size(args)) < 0)
1611 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001613 if (len == 0) {
1614 if (put(self, args) < 0)
1615 goto finally;
1616 }
1617 else {
1618 if (put2(self, args) < 0)
1619 goto finally;
1620 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001622 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
1623 if ((*self->write_func)(self, &MARKv, 1) < 0)
1624 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001625
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001626 i = 0;
1627 while (PyDict_Next(args, &i, &key, &value)) {
1628 if (save(self, key, 0) < 0)
1629 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001631 if (save(self, value, 0) < 0)
1632 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001633
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001634 if (!using_setitems) {
1635 if ((*self->write_func)(self, &setitem, 1) < 0)
1636 goto finally;
1637 }
1638 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001639
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001640 if (using_setitems) {
1641 if ((*self->write_func)(self, &setitems, 1) < 0)
1642 goto finally;
1643 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001644
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001645 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001646
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001647 finally:
1648 if (self->fast && !fast_save_leave(self, args))
1649 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001651 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001652}
1653
1654
Tim Peters84e87f32001-03-17 04:50:51 +00001655static int
Tim Peterscba30e22003-02-01 06:24:36 +00001656save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001657{
1658 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1659 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1660 char *module_str, *name_str;
1661 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001662
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001663 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001665 if (self->fast && !fast_save_enter(self, args))
1666 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001668 if ((*self->write_func)(self, &MARKv, 1) < 0)
1669 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001670
Tim Peterscba30e22003-02-01 06:24:36 +00001671 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001672 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001673
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001674 if (self->bin) {
1675 if (save(self, class, 0) < 0)
1676 goto finally;
1677 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001678
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001679 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1680 PyObject *element = 0;
1681 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001683 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00001684 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001685 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001687 if ((len = PyObject_Size(class_args)) < 0)
1688 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001690 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001691 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001692 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001694 if (save(self, element, 0) < 0) {
1695 Py_DECREF(element);
1696 goto finally;
1697 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001698
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001699 Py_DECREF(element);
1700 }
1701 }
1702 else {
1703 PyErr_Clear();
1704 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001706 if (!self->bin) {
1707 if (!( name = ((PyClassObject *)class)->cl_name )) {
1708 PyErr_SetString(PicklingError, "class has no name");
1709 goto finally;
1710 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001711
Tim Peterscba30e22003-02-01 06:24:36 +00001712 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001713 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001714
Tim Peters84e87f32001-03-17 04:50:51 +00001715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001716 if ((module_size = PyString_Size(module)) < 0 ||
1717 (name_size = PyString_Size(name)) < 0)
1718 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001720 module_str = PyString_AS_STRING((PyStringObject *)module);
1721 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001722
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001723 if ((*self->write_func)(self, &inst, 1) < 0)
1724 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001725
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001726 if ((*self->write_func)(self, module_str, module_size) < 0)
1727 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001728
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001729 if ((*self->write_func)(self, "\n", 1) < 0)
1730 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001732 if ((*self->write_func)(self, name_str, name_size) < 0)
1733 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001734
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001735 if ((*self->write_func)(self, "\n", 1) < 0)
1736 goto finally;
1737 }
1738 else if ((*self->write_func)(self, &obj, 1) < 0) {
1739 goto finally;
1740 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001742 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1743 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00001744 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001745 goto finally;
1746 }
1747 else {
1748 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001750 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1751 PyErr_Clear();
1752 res = 0;
1753 goto finally;
1754 }
1755 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001757 if (!PyDict_Check(state)) {
1758 if (put2(self, args) < 0)
1759 goto finally;
1760 }
1761 else {
1762 if (put(self, args) < 0)
1763 goto finally;
1764 }
Tim Peters84e87f32001-03-17 04:50:51 +00001765
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001766 if (save(self, state, 0) < 0)
1767 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001769 if ((*self->write_func)(self, &build, 1) < 0)
1770 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001772 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001774 finally:
1775 if (self->fast && !fast_save_leave(self, args))
1776 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001778 Py_XDECREF(module);
1779 Py_XDECREF(class);
1780 Py_XDECREF(state);
1781 Py_XDECREF(getinitargs_func);
1782 Py_XDECREF(getstate_func);
1783 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001785 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001786}
1787
1788
Guido van Rossum60456fd1997-04-09 17:36:32 +00001789static int
Tim Peterscba30e22003-02-01 06:24:36 +00001790save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001791{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001792 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001793 char *name_str, *module_str;
1794 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001796 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001797
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001798 if (name) {
1799 global_name = name;
1800 Py_INCREF(global_name);
1801 }
1802 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001803 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001804 goto finally;
1805 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001806
Tim Peterscba30e22003-02-01 06:24:36 +00001807 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001808 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001809
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001810 if ((module_size = PyString_Size(module)) < 0 ||
1811 (name_size = PyString_Size(global_name)) < 0)
1812 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001814 module_str = PyString_AS_STRING((PyStringObject *)module);
1815 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001816
Guido van Rossum75bfd052002-12-24 18:10:07 +00001817 /* XXX This can be doing a relative import. Clearly it shouldn't,
1818 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001819 mod = PyImport_ImportModule(module_str);
1820 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001821 cPickle_ErrFormat(PicklingError,
1822 "Can't pickle %s: it's not found as %s.%s",
1823 "OSS", args, module, global_name);
1824 goto finally;
1825 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001826 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001827 if (klass == NULL) {
1828 cPickle_ErrFormat(PicklingError,
1829 "Can't pickle %s: it's not found as %s.%s",
1830 "OSS", args, module, global_name);
1831 goto finally;
1832 }
1833 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001834 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001835 cPickle_ErrFormat(PicklingError,
1836 "Can't pickle %s: it's not the same object as %s.%s",
1837 "OSS", args, module, global_name);
1838 goto finally;
1839 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001840 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001842 if ((*self->write_func)(self, &global, 1) < 0)
1843 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001845 if ((*self->write_func)(self, module_str, module_size) < 0)
1846 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001847
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001848 if ((*self->write_func)(self, "\n", 1) < 0)
1849 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001851 if ((*self->write_func)(self, name_str, name_size) < 0)
1852 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001854 if ((*self->write_func)(self, "\n", 1) < 0)
1855 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001857 if (put(self, args) < 0)
1858 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001860 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001862 finally:
1863 Py_XDECREF(module);
1864 Py_XDECREF(global_name);
1865 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001867 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001868}
1869
Guido van Rossum60456fd1997-04-09 17:36:32 +00001870static int
Tim Peterscba30e22003-02-01 06:24:36 +00001871save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001872{
1873 PyObject *pid = 0;
1874 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001876 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001877
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001878 Py_INCREF(args);
1879 ARG_TUP(self, args);
1880 if (self->arg) {
1881 pid = PyObject_Call(f, self->arg, NULL);
1882 FREE_ARG_TUP(self);
1883 }
1884 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001886 if (pid != Py_None) {
1887 if (!self->bin) {
1888 if (!PyString_Check(pid)) {
1889 PyErr_SetString(PicklingError,
1890 "persistent id must be string");
1891 goto finally;
1892 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001894 if ((*self->write_func)(self, &persid, 1) < 0)
1895 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001897 if ((size = PyString_Size(pid)) < 0)
1898 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001899
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001900 if ((*self->write_func)(self,
1901 PyString_AS_STRING((PyStringObject *)pid), size) < 0)
1902 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001903
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001904 if ((*self->write_func)(self, "\n", 1) < 0)
1905 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001906
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001907 res = 1;
1908 goto finally;
1909 }
1910 else if (save(self, pid, 1) >= 0) {
1911 if ((*self->write_func)(self, &binpersid, 1) < 0)
1912 res = -1;
1913 else
1914 res = 1;
1915 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001916
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001917 goto finally;
1918 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001919
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001920 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001921
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001922 finally:
1923 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001924
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001925 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001926}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001927
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001928
Tim Peters84e87f32001-03-17 04:50:51 +00001929static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001930save_reduce(Picklerobject *self, PyObject *callable,
Tim Peterscba30e22003-02-01 06:24:36 +00001931 PyObject *tup, PyObject *state, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001932{
1933 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001935 if (save(self, callable, 0) < 0)
1936 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001938 if (save(self, tup, 0) < 0)
1939 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001941 if ((*self->write_func)(self, &reduce, 1) < 0)
1942 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001944 if (ob != NULL) {
1945 if (state && !PyDict_Check(state)) {
1946 if (put2(self, ob) < 0)
1947 return -1;
1948 }
1949 else {
1950 if (put(self, ob) < 0)
1951 return -1;
1952 }
1953 }
Tim Peters84e87f32001-03-17 04:50:51 +00001954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001955 if (state) {
1956 if (save(self, state, 0) < 0)
1957 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001958
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001959 if ((*self->write_func)(self, &build, 1) < 0)
1960 return -1;
1961 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001963 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001964}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001965
Guido van Rossum60456fd1997-04-09 17:36:32 +00001966static int
Tim Peterscba30e22003-02-01 06:24:36 +00001967save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001968{
1969 PyTypeObject *type;
1970 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
1971 *callable = 0, *state = 0;
1972 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001973
Martin v. Löwis5a395302002-08-04 08:20:23 +00001974 if (self->nesting++ > Py_GetRecursionLimit()){
1975 PyErr_SetString(PyExc_RuntimeError,
1976 "maximum recursion depth exceeded");
1977 goto finally;
1978 }
1979
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001980 if (!pers_save && self->pers_func) {
1981 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1982 res = tmp;
1983 goto finally;
1984 }
1985 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001986
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001987 if (args == Py_None) {
1988 res = save_none(self, args);
1989 goto finally;
1990 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001991
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001992 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001993
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001994 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00001995 case 'b':
1996 if (args == Py_False || args == Py_True) {
1997 res = save_bool(self, args);
1998 goto finally;
1999 }
2000 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002001 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002002 if (type == &PyInt_Type) {
2003 res = save_int(self, args);
2004 goto finally;
2005 }
2006 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002007
Guido van Rossum60456fd1997-04-09 17:36:32 +00002008 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002009 if (type == &PyLong_Type) {
2010 res = save_long(self, args);
2011 goto finally;
2012 }
2013 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002014
Guido van Rossum60456fd1997-04-09 17:36:32 +00002015 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002016 if (type == &PyFloat_Type) {
2017 res = save_float(self, args);
2018 goto finally;
2019 }
2020 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002021
Guido van Rossum60456fd1997-04-09 17:36:32 +00002022 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002023 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
2024 if (self->bin) res = save_empty_tuple(self, args);
2025 else res = save_tuple(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 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002031 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2032 res = save_string(self, args, 0);
2033 goto finally;
2034 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002035
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002036#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002037 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002038 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2039 res = save_unicode(self, args, 0);
2040 goto finally;
2041 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002042#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002043 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002045 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002046 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002047 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002048
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002049 if (PyDict_GetItem(self->memo, py_ob_id)) {
2050 if (get(self, py_ob_id) < 0)
2051 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002052
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002053 res = 0;
2054 goto finally;
2055 }
2056 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002058 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002059 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002060 if (type == &PyString_Type) {
2061 res = save_string(self, args, 1);
2062 goto finally;
2063 }
2064 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002065
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002066#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002067 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002068 if (type == &PyUnicode_Type) {
2069 res = save_unicode(self, args, 1);
2070 goto finally;
2071 }
2072 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002073#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002074
Guido van Rossum60456fd1997-04-09 17:36:32 +00002075 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002076 if (type == &PyTuple_Type) {
2077 res = save_tuple(self, args);
2078 goto finally;
2079 }
2080 if (type == &PyType_Type) {
2081 res = save_global(self, args, NULL);
2082 goto finally;
2083 }
2084 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002085
Guido van Rossum60456fd1997-04-09 17:36:32 +00002086 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002087 if (type == &PyList_Type) {
2088 res = save_list(self, args);
2089 goto finally;
2090 }
2091 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002092
2093 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002094 if (type == &PyDict_Type) {
2095 res = save_dict(self, args);
2096 goto finally;
2097 }
2098 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002099
2100 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002101 if (type == &PyInstance_Type) {
2102 res = save_inst(self, args);
2103 goto finally;
2104 }
2105 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002106
2107 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002108 if (type == &PyClass_Type) {
2109 res = save_global(self, args, NULL);
2110 goto finally;
2111 }
2112 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002113
2114 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002115 if (type == &PyFunction_Type) {
2116 res = save_global(self, args, NULL);
2117 goto finally;
2118 }
2119 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002120
2121 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002122 if (type == &PyCFunction_Type) {
2123 res = save_global(self, args, NULL);
2124 goto finally;
2125 }
2126 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002128 if (!pers_save && self->inst_pers_func) {
2129 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2130 res = tmp;
2131 goto finally;
2132 }
2133 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002134
Jeremy Hylton39c61162002-07-16 19:47:43 +00002135 if (PyType_IsSubtype(type, &PyType_Type)) {
2136 res = save_global(self, args, NULL);
2137 goto finally;
2138 }
2139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002140 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2141 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002142
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002143 Py_INCREF(args);
2144 ARG_TUP(self, args);
2145 if (self->arg) {
2146 t = PyObject_Call(__reduce__, self->arg, NULL);
2147 FREE_ARG_TUP(self);
2148 }
2149 if (! t) goto finally;
2150 }
2151 else {
2152 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002153
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002154 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2155 t = PyObject_Call(__reduce__, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00002156 if (!t)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002157 goto finally;
2158 }
2159 else {
2160 PyErr_Clear();
2161 }
2162 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002164 if (t) {
2165 if (PyString_Check(t)) {
2166 res = save_global(self, args, t);
2167 goto finally;
2168 }
Tim Peters84e87f32001-03-17 04:50:51 +00002169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002170 if (!PyTuple_Check(t)) {
2171 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2172 "be a tuple", "O", __reduce__);
2173 goto finally;
2174 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002175
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002176 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002178 if ((size != 3) && (size != 2)) {
2179 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2180 "contain only two or three elements", "O", __reduce__);
2181 goto finally;
2182 }
Tim Peters84e87f32001-03-17 04:50:51 +00002183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002184 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002185
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002186 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002188 if (size > 2) {
2189 state = PyTuple_GET_ITEM(t, 2);
Guido van Rossum8e0ad0c2003-01-31 21:10:31 +00002190 if (state == Py_None)
2191 state = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002192 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002194 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2195 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2196 "returned by %s must be a tuple", "O", __reduce__);
2197 goto finally;
2198 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002200 res = save_reduce(self, callable, arg_tup, state, args);
2201 goto finally;
2202 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002204 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002206 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002207 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002208 Py_XDECREF(py_ob_id);
2209 Py_XDECREF(__reduce__);
2210 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002212 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002213}
2214
2215
2216static int
Tim Peterscba30e22003-02-01 06:24:36 +00002217dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002218{
2219 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002220
Tim Peters4190fb82003-02-02 16:09:05 +00002221 if (self->proto >= 2) {
2222 char bytes[2];
2223
2224 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002225 assert(self->proto >= 0 && self->proto < 256);
2226 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002227 if (self->write_func(self, bytes, 2) < 0)
2228 return -1;
2229 }
2230
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002231 if (save(self, args, 0) < 0)
2232 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002233
Tim Peters4190fb82003-02-02 16:09:05 +00002234 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002235 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002236
Tim Peters4190fb82003-02-02 16:09:05 +00002237 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002238 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002239
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002240 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002241}
2242
2243static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002244Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002245{
Tim Peterscba30e22003-02-01 06:24:36 +00002246 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002247 PyDict_Clear(self->memo);
2248 Py_INCREF(Py_None);
2249 return Py_None;
2250}
2251
2252static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002253Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002254{
2255 int l, i, rsize, ssize, clear=1, lm;
2256 long ik;
2257 PyObject *k, *r;
2258 char *s, *p, *have_get;
2259 Pdata *data;
2260
2261 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002262 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002263 return NULL;
2264
2265 /* Check to make sure we are based on a list */
2266 if (! Pdata_Check(self->file)) {
2267 PyErr_SetString(PicklingError,
2268 "Attempt to getvalue() a non-list-based pickler");
2269 return NULL;
2270 }
2271
2272 /* flush write buffer */
2273 if (write_other(self, NULL, 0) < 0) return NULL;
2274
2275 data=(Pdata*)self->file;
2276 l=data->length;
2277
2278 /* set up an array to hold get/put status */
2279 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2280 lm++;
2281 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
2282 memset(have_get,0,lm);
2283
2284 /* Scan for gets. */
2285 for (rsize=0, i=l; --i >= 0; ) {
2286 k=data->data[i];
2287
2288 if (PyString_Check(k)) {
2289 rsize += PyString_GET_SIZE(k);
2290 }
2291
2292 else if (PyInt_Check(k)) { /* put */
2293 ik=PyInt_AS_LONG((PyIntObject*)k);
2294 if (ik >= lm || ik==0) {
2295 PyErr_SetString(PicklingError,
2296 "Invalid get data");
2297 return NULL;
2298 }
2299 if (have_get[ik]) { /* with matching get */
2300 if (ik < 256) rsize += 2;
2301 else rsize+=5;
2302 }
2303 }
2304
2305 else if (! (PyTuple_Check(k) &&
2306 PyTuple_GET_SIZE(k) == 2 &&
2307 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2308 ) {
2309 PyErr_SetString(PicklingError,
2310 "Unexpected data in internal list");
2311 return NULL;
2312 }
2313
2314 else { /* put */
2315 ik=PyInt_AS_LONG((PyIntObject*)k);
2316 if (ik >= lm || ik==0) {
2317 PyErr_SetString(PicklingError,
2318 "Invalid get data");
2319 return NULL;
2320 }
2321 have_get[ik]=1;
2322 if (ik < 256) rsize += 2;
2323 else rsize+=5;
2324 }
2325
2326 }
2327
2328 /* Now generate the result */
2329 if (!( r=PyString_FromStringAndSize(NULL,rsize))) goto err;
2330 s=PyString_AS_STRING((PyStringObject*)r);
2331
2332 for (i=0; i<l; i++) {
2333 k=data->data[i];
2334
2335 if (PyString_Check(k)) {
2336 ssize=PyString_GET_SIZE(k);
2337 if (ssize) {
2338 p=PyString_AS_STRING((PyStringObject*)k);
2339 while (--ssize >= 0) *s++=*p++;
2340 }
2341 }
2342
2343 else if (PyTuple_Check(k)) { /* get */
2344 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2345 if (ik < 256) {
2346 *s++ = BINGET;
2347 *s++ = (int)(ik & 0xff);
2348 }
2349 else {
2350 *s++ = LONG_BINGET;
2351 *s++ = (int)(ik & 0xff);
2352 *s++ = (int)((ik >> 8) & 0xff);
2353 *s++ = (int)((ik >> 16) & 0xff);
2354 *s++ = (int)((ik >> 24) & 0xff);
2355 }
2356 }
2357
2358 else { /* put */
2359 ik=PyInt_AS_LONG((PyIntObject*)k);
2360
2361 if (have_get[ik]) { /* with matching get */
2362 if (ik < 256) {
2363 *s++ = BINPUT;
2364 *s++ = (int)(ik & 0xff);
2365 }
2366 else {
2367 *s++ = LONG_BINPUT;
2368 *s++ = (int)(ik & 0xff);
2369 *s++ = (int)((ik >> 8) & 0xff);
2370 *s++ = (int)((ik >> 16) & 0xff);
2371 *s++ = (int)((ik >> 24) & 0xff);
2372 }
2373 }
2374 }
2375
2376 }
2377
2378 if (clear) {
2379 PyDict_Clear(self->memo);
2380 Pdata_clear(data,0);
2381 }
2382
2383 free(have_get);
2384 return r;
2385 err:
2386 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002387 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002388}
2389
2390static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002391Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002392{
2393 PyObject *ob;
2394 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002395
Tim Peterscba30e22003-02-01 06:24:36 +00002396 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002397 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002399 if (dump(self, ob) < 0)
2400 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002402 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002404 /* XXX Why does dump() return self? */
2405 Py_INCREF(self);
2406 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002407}
2408
2409
Tim Peterscba30e22003-02-01 06:24:36 +00002410static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002411{
Neal Norwitzb0493252002-03-31 14:44:22 +00002412 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002413 PyDoc_STR("dump(object) -- "
2414 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002415 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002416 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002417 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002418 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002419 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002420};
2421
2422
2423static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002424newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002425{
2426 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002427
Tim Peters5bd2a792003-02-01 16:45:06 +00002428 if (proto < 0)
2429 proto = CURRENT_PROTOCOL_NUMBER;
2430 if (proto > CURRENT_PROTOCOL_NUMBER) {
2431 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2432 "the highest available protocol is %d",
2433 proto, CURRENT_PROTOCOL_NUMBER);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002434 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002435 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002436
Tim Peters5bd2a792003-02-01 16:45:06 +00002437 self = PyObject_New(Picklerobject, &Picklertype);
2438 if (self == NULL)
2439 return NULL;
2440 self->proto = proto;
2441 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002442 self->fp = NULL;
2443 self->write = NULL;
2444 self->memo = NULL;
2445 self->arg = NULL;
2446 self->pers_func = NULL;
2447 self->inst_pers_func = NULL;
2448 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002449 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002450 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002451 self->fast_container = 0;
2452 self->fast_memo = NULL;
2453 self->buf_size = 0;
2454 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002455
Tim Peters5bd2a792003-02-01 16:45:06 +00002456 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002457 if (file)
2458 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002459 else {
2460 file = Pdata_New();
2461 if (file == NULL)
2462 goto err;
2463 }
2464 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002465
Tim Peterscba30e22003-02-01 06:24:36 +00002466 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002467 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002468
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002469 if (PyFile_Check(file)) {
2470 self->fp = PyFile_AsFile(file);
2471 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002472 PyErr_SetString(PyExc_ValueError,
2473 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002474 goto err;
2475 }
2476 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002477 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002478 else if (PycStringIO_OutputCheck(file)) {
2479 self->write_func = write_cStringIO;
2480 }
2481 else if (file == Py_None) {
2482 self->write_func = write_none;
2483 }
2484 else {
2485 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002487 if (! Pdata_Check(file)) {
2488 self->write = PyObject_GetAttr(file, write_str);
2489 if (!self->write) {
2490 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002491 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002492 "argument must have 'write' "
2493 "attribute");
2494 goto err;
2495 }
2496 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002497
Tim Peters5bd2a792003-02-01 16:45:06 +00002498 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2499 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002500 PyErr_NoMemory();
2501 goto err;
2502 }
2503 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002505 if (PyEval_GetRestricted()) {
2506 /* Restricted execution, get private tables */
2507 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002509 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2510 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2511 Py_DECREF(m);
2512 if (!( self->dispatch_table )) goto err;
2513 }
2514 else {
2515 self->dispatch_table=dispatch_table;
2516 Py_INCREF(dispatch_table);
2517 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002518
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002519 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002521 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002522 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002523 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002524}
2525
2526
2527static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002528get_Pickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002529{
2530 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002531 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002532
Tim Peters5bd2a792003-02-01 16:45:06 +00002533 /* XXX What is this doing? The documented signature is
2534 * XXX Pickler(file, proto=0), but this accepts Pickler() and
2535 * XXX Pickler(integer) too. The meaning then is clear as mud.
2536 * XXX Bug? Feature?
2537 */
2538 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002539 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002540 proto = 0;
2541 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002542 return NULL;
2543 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002544 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002545}
2546
2547
2548static void
Tim Peterscba30e22003-02-01 06:24:36 +00002549Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002550{
2551 Py_XDECREF(self->write);
2552 Py_XDECREF(self->memo);
2553 Py_XDECREF(self->fast_memo);
2554 Py_XDECREF(self->arg);
2555 Py_XDECREF(self->file);
2556 Py_XDECREF(self->pers_func);
2557 Py_XDECREF(self->inst_pers_func);
2558 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002559 PyMem_Free(self->write_buf);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002560 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002561}
2562
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002563static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002564Pickler_get_pers_func(Picklerobject *p)
2565{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002566 if (p->pers_func == NULL)
2567 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2568 else
2569 Py_INCREF(p->pers_func);
2570 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002571}
2572
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002573static int
2574Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2575{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002576 if (v == NULL) {
2577 PyErr_SetString(PyExc_TypeError,
2578 "attribute deletion is not supported");
2579 return -1;
2580 }
2581 Py_XDECREF(p->pers_func);
2582 Py_INCREF(v);
2583 p->pers_func = v;
2584 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002585}
2586
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002587static int
2588Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2589{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002590 if (v == NULL) {
2591 PyErr_SetString(PyExc_TypeError,
2592 "attribute deletion is not supported");
2593 return -1;
2594 }
2595 Py_XDECREF(p->inst_pers_func);
2596 Py_INCREF(v);
2597 p->inst_pers_func = v;
2598 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002599}
2600
2601static PyObject *
2602Pickler_get_memo(Picklerobject *p)
2603{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002604 if (p->memo == NULL)
2605 PyErr_SetString(PyExc_AttributeError, "memo");
2606 else
2607 Py_INCREF(p->memo);
2608 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002609}
2610
2611static int
2612Pickler_set_memo(Picklerobject *p, PyObject *v)
2613{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002614 if (v == NULL) {
2615 PyErr_SetString(PyExc_TypeError,
2616 "attribute deletion is not supported");
2617 return -1;
2618 }
2619 if (!PyDict_Check(v)) {
2620 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2621 return -1;
2622 }
2623 Py_XDECREF(p->memo);
2624 Py_INCREF(v);
2625 p->memo = v;
2626 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002627}
2628
2629static PyObject *
2630Pickler_get_error(Picklerobject *p)
2631{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002632 /* why is this an attribute on the Pickler? */
2633 Py_INCREF(PicklingError);
2634 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002635}
2636
2637static PyMemberDef Pickler_members[] = {
2638 {"binary", T_INT, offsetof(Picklerobject, bin)},
2639 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002640 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002641};
2642
2643static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002644 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002645 (setter)Pickler_set_pers_func},
2646 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2647 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002648 {"PicklingError", (getter)Pickler_get_error, NULL},
2649 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002650};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002651
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002652PyDoc_STRVAR(Picklertype__doc__,
2653"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002654
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002655static PyTypeObject Picklertype = {
2656 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002657 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002658 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002659 sizeof(Picklerobject), /*tp_basicsize*/
2660 0,
2661 (destructor)Pickler_dealloc, /* tp_dealloc */
2662 0, /* tp_print */
2663 0, /* tp_getattr */
2664 0, /* tp_setattr */
2665 0, /* tp_compare */
2666 0, /* tp_repr */
2667 0, /* tp_as_number */
2668 0, /* tp_as_sequence */
2669 0, /* tp_as_mapping */
2670 0, /* tp_hash */
2671 0, /* tp_call */
2672 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002673 PyObject_GenericGetAttr, /* tp_getattro */
2674 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002675 0, /* tp_as_buffer */
2676 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2677 Picklertype__doc__, /* tp_doc */
2678 0, /* tp_traverse */
2679 0, /* tp_clear */
2680 0, /* tp_richcompare */
2681 0, /* tp_weaklistoffset */
2682 0, /* tp_iter */
2683 0, /* tp_iternext */
2684 Pickler_methods, /* tp_methods */
2685 Pickler_members, /* tp_members */
2686 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002687};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002688
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002689static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002690find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002691{
2692 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002694 if (fc) {
2695 if (fc==Py_None) {
2696 PyErr_SetString(UnpicklingError,
2697 "Global and instance pickles are not supported.");
2698 return NULL;
2699 }
Tim Peterscba30e22003-02-01 06:24:36 +00002700 return PyObject_CallFunction(fc, "OO", py_module_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002701 py_global_name);
2702 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002703
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002704 module = PySys_GetObject("modules");
2705 if (module == NULL)
2706 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002708 module = PyDict_GetItem(module, py_module_name);
2709 if (module == NULL) {
2710 module = PyImport_Import(py_module_name);
2711 if (!module)
2712 return NULL;
2713 global = PyObject_GetAttr(module, py_global_name);
2714 Py_DECREF(module);
2715 }
2716 else
2717 global = PyObject_GetAttr(module, py_global_name);
2718 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002719}
2720
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002721static int
Tim Peterscba30e22003-02-01 06:24:36 +00002722marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002723{
2724 if (self->num_marks < 1) {
2725 PyErr_SetString(UnpicklingError, "could not find MARK");
2726 return -1;
2727 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002728
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002729 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002730}
2731
Tim Peters84e87f32001-03-17 04:50:51 +00002732
Guido van Rossum60456fd1997-04-09 17:36:32 +00002733static int
Tim Peterscba30e22003-02-01 06:24:36 +00002734load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002735{
2736 PDATA_APPEND(self->stack, Py_None, -1);
2737 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002738}
2739
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002740static int
Tim Peterscba30e22003-02-01 06:24:36 +00002741bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002742{
2743 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2744 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002745}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002746
2747static int
Tim Peterscba30e22003-02-01 06:24:36 +00002748load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002749{
2750 PyObject *py_int = 0;
2751 char *endptr, *s;
2752 int len, res = -1;
2753 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002754
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002755 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2756 if (len < 2) return bad_readline();
2757 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002759 errno = 0;
2760 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002762 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2763 /* Hm, maybe we've got something long. Let's try reading
2764 it as a Python long object. */
2765 errno = 0;
2766 py_int = PyLong_FromString(s, NULL, 0);
2767 if (py_int == NULL) {
2768 PyErr_SetString(PyExc_ValueError,
2769 "could not convert string to int");
2770 goto finally;
2771 }
2772 }
2773 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002774 if (len == 3 && (l == 0 || l == 1)) {
2775 if (!( py_int = PyBool_FromLong(l))) goto finally;
2776 }
2777 else {
2778 if (!( py_int = PyInt_FromLong(l))) goto finally;
2779 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002780 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002782 free(s);
2783 PDATA_PUSH(self->stack, py_int, -1);
2784 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002785
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002786 finally:
2787 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002789 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002790}
2791
Tim Petersee1a53c2003-02-02 02:57:53 +00002792/* s contains x bytes of a little-endian integer. Return its value as a
2793 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
2794 * int, but when x is 4 it's a signed one. This is an historical source
2795 * of x-platform bugs.
2796 */
Tim Peters84e87f32001-03-17 04:50:51 +00002797static long
Tim Petersee1a53c2003-02-02 02:57:53 +00002798calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002799{
2800 unsigned char c;
2801 int i;
2802 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002804 for (i = 0, l = 0L; i < x; i++) {
2805 c = (unsigned char)s[i];
2806 l |= (long)c << (i * 8);
2807 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002808#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002809 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2810 * is signed, so on a box with longs bigger than 4 bytes we need
2811 * to extend a BININT's sign bit to the full width.
2812 */
2813 if (x == 4 && l & (1L << 31))
2814 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002815#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002816 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002817}
2818
2819
2820static int
Tim Peterscba30e22003-02-01 06:24:36 +00002821load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002822{
2823 PyObject *py_int = 0;
2824 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002825
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002826 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002827
Tim Peterscba30e22003-02-01 06:24:36 +00002828 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002829 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002831 PDATA_PUSH(self->stack, py_int, -1);
2832 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002833}
2834
2835
2836static int
Tim Peterscba30e22003-02-01 06:24:36 +00002837load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002838{
2839 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002840
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002841 if ((*self->read_func)(self, &s, 4) < 0)
2842 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002844 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002845}
2846
2847
2848static int
Tim Peterscba30e22003-02-01 06:24:36 +00002849load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002850{
2851 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002852
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002853 if ((*self->read_func)(self, &s, 1) < 0)
2854 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002855
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002856 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002857}
2858
2859
2860static int
Tim Peterscba30e22003-02-01 06:24:36 +00002861load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002862{
2863 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002865 if ((*self->read_func)(self, &s, 2) < 0)
2866 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002868 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002869}
Tim Peters84e87f32001-03-17 04:50:51 +00002870
Guido van Rossum60456fd1997-04-09 17:36:32 +00002871static int
Tim Peterscba30e22003-02-01 06:24:36 +00002872load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002873{
2874 PyObject *l = 0;
2875 char *end, *s;
2876 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002877
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002878 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2879 if (len < 2) return bad_readline();
2880 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002881
Tim Peterscba30e22003-02-01 06:24:36 +00002882 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002883 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002884
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002885 free(s);
2886 PDATA_PUSH(self->stack, l, -1);
2887 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002888
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002889 finally:
2890 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002892 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002893}
2894
Tim Petersee1a53c2003-02-02 02:57:53 +00002895/* 'size' bytes contain the # of bytes of little-endian 256's-complement
2896 * data following.
2897 */
2898static int
2899load_counted_long(Unpicklerobject *self, int size)
2900{
2901 int i;
2902 char *nbytes;
2903 unsigned char *pdata;
2904 PyObject *along;
2905
2906 assert(size == 1 || size == 4);
2907 i = self->read_func(self, &nbytes, size);
2908 if (i < 0) return -1;
2909
2910 size = calc_binint(nbytes, size);
2911 if (size < 0) {
2912 /* Corrupt or hostile pickle -- we never write one like
2913 * this.
2914 */
2915 PyErr_SetString(PyExc_ValueError, "LONG pickle has negative "
2916 "byte count");
2917 return -1;
2918 }
2919
2920 if (size == 0)
2921 along = PyLong_FromLong(0L);
2922 else {
2923 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00002924 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00002925 if (i < 0) return -1;
2926 along = _PyLong_FromByteArray(pdata, (size_t)size,
2927 1 /* little endian */, 1 /* signed */);
2928 }
2929 if (along == NULL)
2930 return -1;
2931 PDATA_PUSH(self->stack, along, -1);
2932 return 0;
2933}
Tim Peters84e87f32001-03-17 04:50:51 +00002934
Guido van Rossum60456fd1997-04-09 17:36:32 +00002935static int
Tim Peterscba30e22003-02-01 06:24:36 +00002936load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002937{
2938 PyObject *py_float = 0;
2939 char *endptr, *s;
2940 int len, res = -1;
2941 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002943 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2944 if (len < 2) return bad_readline();
2945 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002947 errno = 0;
2948 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002949
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002950 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2951 PyErr_SetString(PyExc_ValueError,
2952 "could not convert string to float");
2953 goto finally;
2954 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002955
Tim Peterscba30e22003-02-01 06:24:36 +00002956 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002957 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002958
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002959 free(s);
2960 PDATA_PUSH(self->stack, py_float, -1);
2961 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002963 finally:
2964 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002966 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002967}
2968
Guido van Rossum60456fd1997-04-09 17:36:32 +00002969static int
Tim Peterscba30e22003-02-01 06:24:36 +00002970load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002971{
2972 PyObject *py_float = 0;
2973 int s, e;
2974 long fhi, flo;
2975 double x;
2976 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002977
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002978 if ((*self->read_func)(self, &p, 8) < 0)
2979 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002981 /* First byte */
2982 s = (*p>>7) & 1;
2983 e = (*p & 0x7F) << 4;
2984 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002985
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002986 /* Second byte */
2987 e |= (*p>>4) & 0xF;
2988 fhi = (*p & 0xF) << 24;
2989 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002990
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002991 /* Third byte */
2992 fhi |= (*p & 0xFF) << 16;
2993 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002994
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002995 /* Fourth byte */
2996 fhi |= (*p & 0xFF) << 8;
2997 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002998
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002999 /* Fifth byte */
3000 fhi |= *p & 0xFF;
3001 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003002
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003003 /* Sixth byte */
3004 flo = (*p & 0xFF) << 16;
3005 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003006
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003007 /* Seventh byte */
3008 flo |= (*p & 0xFF) << 8;
3009 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003010
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003011 /* Eighth byte */
3012 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003014 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
3015 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003016
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003017 /* XXX This sadly ignores Inf/NaN */
3018 if (e == 0)
3019 e = -1022;
3020 else {
3021 x += 1.0;
3022 e -= 1023;
3023 }
3024 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003026 if (s)
3027 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003028
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003029 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003031 PDATA_PUSH(self->stack, py_float, -1);
3032 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003033}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003034
3035static int
Tim Peterscba30e22003-02-01 06:24:36 +00003036load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003037{
3038 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003039 int len, res = -1;
3040 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003042 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3043 if (len < 2) return bad_readline();
3044 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003045
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003046
3047 /* Strip outermost quotes */
3048 while (s[len-1] <= ' ')
3049 len--;
3050 if(s[0]=='"' && s[len-1]=='"'){
3051 s[len-1] = '\0';
3052 p = s + 1 ;
3053 len -= 2;
3054 } else if(s[0]=='\'' && s[len-1]=='\''){
3055 s[len-1] = '\0';
3056 p = s + 1 ;
3057 len -= 2;
3058 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003059 goto insecure;
3060 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003061
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003062 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
3063 if (str) {
3064 PDATA_PUSH(self->stack, str, -1);
3065 res = 0;
3066 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003067 free(s);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003068 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003069
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003070 insecure:
3071 free(s);
3072 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3073 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003074}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003075
3076
3077static int
Tim Peterscba30e22003-02-01 06:24:36 +00003078load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003079{
3080 PyObject *py_string = 0;
3081 long l;
3082 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003084 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003085
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003086 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003088 if ((*self->read_func)(self, &s, l) < 0)
3089 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003090
Tim Peterscba30e22003-02-01 06:24:36 +00003091 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003092 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003093
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003094 PDATA_PUSH(self->stack, py_string, -1);
3095 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003096}
3097
3098
3099static int
Tim Peterscba30e22003-02-01 06:24:36 +00003100load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003101{
3102 PyObject *py_string = 0;
3103 unsigned char l;
3104 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003105
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003106 if ((*self->read_func)(self, &s, 1) < 0)
3107 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003109 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003111 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003112
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003113 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003114
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003115 PDATA_PUSH(self->stack, py_string, -1);
3116 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003117}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003118
3119
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003120#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003121static int
Tim Peterscba30e22003-02-01 06:24:36 +00003122load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003123{
3124 PyObject *str = 0;
3125 int len, res = -1;
3126 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003128 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3129 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003130
Tim Peterscba30e22003-02-01 06:24:36 +00003131 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003132 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003133
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003134 PDATA_PUSH(self->stack, str, -1);
3135 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003136
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003137 finally:
3138 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003139}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003140#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003141
3142
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003143#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003144static int
Tim Peterscba30e22003-02-01 06:24:36 +00003145load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003146{
3147 PyObject *unicode;
3148 long l;
3149 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003150
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003151 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003153 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003155 if ((*self->read_func)(self, &s, l) < 0)
3156 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003157
Tim Peterscba30e22003-02-01 06:24:36 +00003158 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003159 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003160
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003161 PDATA_PUSH(self->stack, unicode, -1);
3162 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003163}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003164#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003165
3166
3167static int
Tim Peterscba30e22003-02-01 06:24:36 +00003168load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003169{
3170 PyObject *tup;
3171 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003173 if ((i = marker(self)) < 0) return -1;
3174 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3175 PDATA_PUSH(self->stack, tup, -1);
3176 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003177}
3178
3179static int
Tim Peterscba30e22003-02-01 06:24:36 +00003180load_empty_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003181{
3182 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003184 if (!( tup=PyTuple_New(0))) return -1;
3185 PDATA_PUSH(self->stack, tup, -1);
3186 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003187}
3188
3189static int
Tim Peterscba30e22003-02-01 06:24:36 +00003190load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003191{
3192 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003194 if (!( list=PyList_New(0))) return -1;
3195 PDATA_PUSH(self->stack, list, -1);
3196 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003197}
3198
3199static int
Tim Peterscba30e22003-02-01 06:24:36 +00003200load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003201{
3202 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003204 if (!( dict=PyDict_New())) return -1;
3205 PDATA_PUSH(self->stack, dict, -1);
3206 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003207}
3208
3209
3210static int
Tim Peterscba30e22003-02-01 06:24:36 +00003211load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003212{
3213 PyObject *list = 0;
3214 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003216 if ((i = marker(self)) < 0) return -1;
3217 if (!( list=Pdata_popList(self->stack, i))) return -1;
3218 PDATA_PUSH(self->stack, list, -1);
3219 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003220}
3221
3222static int
Tim Peterscba30e22003-02-01 06:24:36 +00003223load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003224{
3225 PyObject *dict, *key, *value;
3226 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003227
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003228 if ((i = marker(self)) < 0) return -1;
3229 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003230
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003231 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003232
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003233 for (k = i+1; k < j; k += 2) {
3234 key =self->stack->data[k-1];
3235 value=self->stack->data[k ];
3236 if (PyDict_SetItem(dict, key, value) < 0) {
3237 Py_DECREF(dict);
3238 return -1;
3239 }
3240 }
3241 Pdata_clear(self->stack, i);
3242 PDATA_PUSH(self->stack, dict, -1);
3243 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003244}
3245
3246static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003247Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003248{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003249 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003250
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003251 if (PyClass_Check(cls)) {
3252 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003253
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003254 if ((l=PyObject_Size(args)) < 0) goto err;
3255 if (!( l )) {
3256 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003257
Tim Peterscba30e22003-02-01 06:24:36 +00003258 __getinitargs__ = PyObject_GetAttr(cls,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003259 __getinitargs___str);
3260 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003261 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003262 so bypass usual construction */
3263 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003265 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003266 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003267 goto err;
3268 return inst;
3269 }
3270 Py_DECREF(__getinitargs__);
3271 }
Tim Peters84e87f32001-03-17 04:50:51 +00003272
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003273 if ((r=PyInstance_New(cls, args, NULL))) return r;
3274 else goto err;
3275 }
Tim Peters84e87f32001-03-17 04:50:51 +00003276
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003277 if (args==Py_None) {
3278 /* Special case, call cls.__basicnew__() */
3279 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003281 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3282 if (!basicnew) return NULL;
3283 r=PyObject_CallObject(basicnew, NULL);
3284 Py_DECREF(basicnew);
3285 if (r) return r;
3286 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003288 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003289
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003290 err:
3291 {
3292 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003294 PyErr_Fetch(&tp, &v, &tb);
3295 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3296 Py_XDECREF(v);
3297 v=r;
3298 }
3299 PyErr_Restore(tp,v,tb);
3300 }
3301 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003302}
Tim Peters84e87f32001-03-17 04:50:51 +00003303
Guido van Rossum60456fd1997-04-09 17:36:32 +00003304
3305static int
Tim Peterscba30e22003-02-01 06:24:36 +00003306load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003307{
3308 PyObject *class, *tup, *obj=0;
3309 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003311 if ((i = marker(self)) < 0) return -1;
3312 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3313 PDATA_POP(self->stack, class);
3314 if (class) {
3315 obj = Instance_New(class, tup);
3316 Py_DECREF(class);
3317 }
3318 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003319
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003320 if (! obj) return -1;
3321 PDATA_PUSH(self->stack, obj, -1);
3322 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003323}
3324
3325
3326static int
Tim Peterscba30e22003-02-01 06:24:36 +00003327load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003328{
3329 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3330 int i, len;
3331 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003332
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003333 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003334
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003335 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3336 if (len < 2) return bad_readline();
3337 module_name = PyString_FromStringAndSize(s, len - 1);
3338 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003339
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003340 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3341 if (len < 2) return bad_readline();
3342 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003343 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003344 self->find_class);
3345 Py_DECREF(class_name);
3346 }
3347 }
3348 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003349
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003350 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003351
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003352 if ((tup=Pdata_popTuple(self->stack, i))) {
3353 obj = Instance_New(class, tup);
3354 Py_DECREF(tup);
3355 }
3356 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003358 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003359
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003360 PDATA_PUSH(self->stack, obj, -1);
3361 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003362}
3363
3364
3365static int
Tim Peterscba30e22003-02-01 06:24:36 +00003366load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003367{
3368 PyObject *class = 0, *module_name = 0, *class_name = 0;
3369 int len;
3370 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003372 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3373 if (len < 2) return bad_readline();
3374 module_name = PyString_FromStringAndSize(s, len - 1);
3375 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003377 if ((len = (*self->readline_func)(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003378 if (len < 2) {
3379 Py_DECREF(module_name);
3380 return bad_readline();
3381 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003382 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003383 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003384 self->find_class);
3385 Py_DECREF(class_name);
3386 }
3387 }
3388 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003389
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003390 if (! class) return -1;
3391 PDATA_PUSH(self->stack, class, -1);
3392 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003393}
3394
3395
3396static int
Tim Peterscba30e22003-02-01 06:24:36 +00003397load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003398{
3399 PyObject *pid = 0;
3400 int len;
3401 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003403 if (self->pers_func) {
3404 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3405 if (len < 2) return bad_readline();
3406
3407 pid = PyString_FromStringAndSize(s, len - 1);
3408 if (!pid) return -1;
3409
3410 if (PyList_Check(self->pers_func)) {
3411 if (PyList_Append(self->pers_func, pid) < 0) {
3412 Py_DECREF(pid);
3413 return -1;
3414 }
3415 }
3416 else {
3417 ARG_TUP(self, pid);
3418 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003419 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003420 NULL);
3421 FREE_ARG_TUP(self);
3422 }
3423 }
3424
3425 if (! pid) return -1;
3426
3427 PDATA_PUSH(self->stack, pid, -1);
3428 return 0;
3429 }
3430 else {
3431 PyErr_SetString(UnpicklingError,
3432 "A load persistent id instruction was encountered,\n"
3433 "but no persistent_load function was specified.");
3434 return -1;
3435 }
3436}
3437
3438static int
Tim Peterscba30e22003-02-01 06:24:36 +00003439load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003440{
3441 PyObject *pid = 0;
3442
3443 if (self->pers_func) {
3444 PDATA_POP(self->stack, pid);
3445 if (! pid) return -1;
3446
3447 if (PyList_Check(self->pers_func)) {
3448 if (PyList_Append(self->pers_func, pid) < 0) {
3449 Py_DECREF(pid);
3450 return -1;
3451 }
3452 }
3453 else {
3454 ARG_TUP(self, pid);
3455 if (self->arg) {
3456 pid = PyObject_Call(self->pers_func, self->arg,
3457 NULL);
3458 FREE_ARG_TUP(self);
3459 }
3460 if (! pid) return -1;
3461 }
3462
3463 PDATA_PUSH(self->stack, pid, -1);
3464 return 0;
3465 }
3466 else {
3467 PyErr_SetString(UnpicklingError,
3468 "A load persistent id instruction was encountered,\n"
3469 "but no persistent_load function was specified.");
3470 return -1;
3471 }
3472}
3473
3474
3475static int
Tim Peterscba30e22003-02-01 06:24:36 +00003476load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003477{
3478 int len;
3479
3480 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3481
3482 /* Note that we split the (pickle.py) stack into two stacks,
3483 an object stack and a mark stack. We have to be clever and
3484 pop the right one. We do this by looking at the top of the
3485 mark stack.
3486 */
3487
3488 if ((self->num_marks > 0) &&
3489 (self->marks[self->num_marks - 1] == len))
3490 self->num_marks--;
3491 else {
3492 len--;
3493 Py_DECREF(self->stack->data[len]);
3494 self->stack->length=len;
3495 }
3496
3497 return 0;
3498}
3499
3500
3501static int
Tim Peterscba30e22003-02-01 06:24:36 +00003502load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003503{
3504 int i;
3505
3506 if ((i = marker(self)) < 0)
3507 return -1;
3508
3509 Pdata_clear(self->stack, i);
3510
3511 return 0;
3512}
3513
3514
3515static int
Tim Peterscba30e22003-02-01 06:24:36 +00003516load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003517{
3518 PyObject *last;
3519 int len;
3520
3521 if ((len = self->stack->length) <= 0) return stackUnderflow();
3522 last=self->stack->data[len-1];
3523 Py_INCREF(last);
3524 PDATA_PUSH(self->stack, last, -1);
3525 return 0;
3526}
3527
3528
3529static int
Tim Peterscba30e22003-02-01 06:24:36 +00003530load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003531{
3532 PyObject *py_str = 0, *value = 0;
3533 int len;
3534 char *s;
3535 int rc;
3536
3537 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003538 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003539
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003540 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003542 value = PyDict_GetItem(self->memo, py_str);
3543 if (! value) {
3544 PyErr_SetObject(BadPickleGet, py_str);
3545 rc = -1;
3546 } else {
3547 PDATA_APPEND(self->stack, value, -1);
3548 rc = 0;
3549 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003550
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003551 Py_DECREF(py_str);
3552 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003553}
3554
3555
3556static int
Tim Peterscba30e22003-02-01 06:24:36 +00003557load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003558{
3559 PyObject *py_key = 0, *value = 0;
3560 unsigned char key;
3561 char *s;
3562 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003564 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003566 key = (unsigned char)s[0];
3567 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003569 value = PyDict_GetItem(self->memo, py_key);
3570 if (! value) {
3571 PyErr_SetObject(BadPickleGet, py_key);
3572 rc = -1;
3573 } else {
3574 PDATA_APPEND(self->stack, value, -1);
3575 rc = 0;
3576 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003577
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003578 Py_DECREF(py_key);
3579 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003580}
3581
3582
3583static int
Tim Peterscba30e22003-02-01 06:24:36 +00003584load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003585{
3586 PyObject *py_key = 0, *value = 0;
3587 unsigned char c;
3588 char *s;
3589 long key;
3590 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003592 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003593
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003594 c = (unsigned char)s[0];
3595 key = (long)c;
3596 c = (unsigned char)s[1];
3597 key |= (long)c << 8;
3598 c = (unsigned char)s[2];
3599 key |= (long)c << 16;
3600 c = (unsigned char)s[3];
3601 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003603 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3604
3605 value = PyDict_GetItem(self->memo, py_key);
3606 if (! value) {
3607 PyErr_SetObject(BadPickleGet, py_key);
3608 rc = -1;
3609 } else {
3610 PDATA_APPEND(self->stack, value, -1);
3611 rc = 0;
3612 }
3613
3614 Py_DECREF(py_key);
3615 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003616}
3617
3618
3619static int
Tim Peterscba30e22003-02-01 06:24:36 +00003620load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003621{
3622 PyObject *py_str = 0, *value = 0;
3623 int len, l;
3624 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003625
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003626 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
3627 if (l < 2) return bad_readline();
3628 if (!( len=self->stack->length )) return stackUnderflow();
3629 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3630 value=self->stack->data[len-1];
3631 l=PyDict_SetItem(self->memo, py_str, value);
3632 Py_DECREF(py_str);
3633 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003634}
3635
3636
3637static int
Tim Peterscba30e22003-02-01 06:24:36 +00003638load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003639{
3640 PyObject *py_key = 0, *value = 0;
3641 unsigned char key;
3642 char *s;
3643 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003644
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003645 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3646 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003648 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003649
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003650 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3651 value=self->stack->data[len-1];
3652 len=PyDict_SetItem(self->memo, py_key, value);
3653 Py_DECREF(py_key);
3654 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003655}
3656
3657
3658static int
Tim Peterscba30e22003-02-01 06:24:36 +00003659load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003660{
3661 PyObject *py_key = 0, *value = 0;
3662 long key;
3663 unsigned char c;
3664 char *s;
3665 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003666
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003667 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3668 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003669
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003670 c = (unsigned char)s[0];
3671 key = (long)c;
3672 c = (unsigned char)s[1];
3673 key |= (long)c << 8;
3674 c = (unsigned char)s[2];
3675 key |= (long)c << 16;
3676 c = (unsigned char)s[3];
3677 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003678
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003679 if (!( py_key = PyInt_FromLong(key))) return -1;
3680 value=self->stack->data[len-1];
3681 len=PyDict_SetItem(self->memo, py_key, value);
3682 Py_DECREF(py_key);
3683 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003684}
3685
3686
3687static int
Tim Peterscba30e22003-02-01 06:24:36 +00003688do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003689{
3690 PyObject *value = 0, *list = 0, *append_method = 0;
3691 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003693 len=self->stack->length;
3694 if (!( len >= x && x > 0 )) return stackUnderflow();
3695 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003696 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003698 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003700 if (PyList_Check(list)) {
3701 PyObject *slice;
3702 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003703
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003704 slice=Pdata_popList(self->stack, x);
3705 list_len = PyList_GET_SIZE(list);
3706 i=PyList_SetSlice(list, list_len, list_len, slice);
3707 Py_DECREF(slice);
3708 return i;
3709 }
3710 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003711
Tim Peterscba30e22003-02-01 06:24:36 +00003712 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003713 return -1;
3714
3715 for (i = x; i < len; i++) {
3716 PyObject *junk;
3717
3718 value=self->stack->data[i];
3719 junk=0;
3720 ARG_TUP(self, value);
3721 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003722 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003723 NULL);
3724 FREE_ARG_TUP(self);
3725 }
3726 if (! junk) {
3727 Pdata_clear(self->stack, i+1);
3728 self->stack->length=x;
3729 Py_DECREF(append_method);
3730 return -1;
3731 }
3732 Py_DECREF(junk);
3733 }
3734 self->stack->length=x;
3735 Py_DECREF(append_method);
3736 }
3737
3738 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003739}
3740
3741
3742static int
Tim Peterscba30e22003-02-01 06:24:36 +00003743load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003744{
3745 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003746}
3747
3748
3749static int
Tim Peterscba30e22003-02-01 06:24:36 +00003750load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003751{
3752 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003753}
3754
3755
3756static int
Tim Peterscba30e22003-02-01 06:24:36 +00003757do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003758{
3759 PyObject *value = 0, *key = 0, *dict = 0;
3760 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003762 if (!( (len=self->stack->length) >= x
3763 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003765 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003767 for (i = x+1; i < len; i += 2) {
3768 key =self->stack->data[i-1];
3769 value=self->stack->data[i ];
3770 if (PyObject_SetItem(dict, key, value) < 0) {
3771 r=-1;
3772 break;
3773 }
3774 }
3775
3776 Pdata_clear(self->stack, x);
3777
3778 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003779}
3780
3781
Tim Peters84e87f32001-03-17 04:50:51 +00003782static int
Tim Peterscba30e22003-02-01 06:24:36 +00003783load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003784{
3785 return do_setitems(self, self->stack->length - 2);
3786}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003788static int
Tim Peterscba30e22003-02-01 06:24:36 +00003789load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003790{
3791 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003792}
3793
Tim Peters84e87f32001-03-17 04:50:51 +00003794
Guido van Rossum60456fd1997-04-09 17:36:32 +00003795static int
Tim Peterscba30e22003-02-01 06:24:36 +00003796load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003797{
3798 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3799 *junk = 0, *__setstate__ = 0;
3800 int i, r = 0;
3801
3802 if (self->stack->length < 2) return stackUnderflow();
3803 PDATA_POP(self->stack, value);
3804 if (! value) return -1;
3805 inst=self->stack->data[self->stack->length-1];
3806
3807 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3808 ARG_TUP(self, value);
3809 if (self->arg) {
3810 junk = PyObject_Call(__setstate__, self->arg, NULL);
3811 FREE_ARG_TUP(self);
3812 }
3813 Py_DECREF(__setstate__);
3814 if (! junk) return -1;
3815 Py_DECREF(junk);
3816 return 0;
3817 }
3818
3819 PyErr_Clear();
3820 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3821 i = 0;
3822 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3823 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3824 r=-1;
3825 break;
3826 }
3827 }
3828 Py_DECREF(instdict);
3829 }
3830 else r=-1;
3831
3832 Py_XDECREF(value);
3833
3834 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003835}
3836
3837
3838static int
Tim Peterscba30e22003-02-01 06:24:36 +00003839load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003840{
3841 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003843 /* Note that we split the (pickle.py) stack into two stacks, an
3844 object stack and a mark stack. Here we push a mark onto the
3845 mark stack.
3846 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003847
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003848 if ((self->num_marks + 1) >= self->marks_size) {
3849 s=self->marks_size+20;
3850 if (s <= self->num_marks) s=self->num_marks + 1;
3851 if (self->marks == NULL)
3852 self->marks=(int *)malloc(s * sizeof(int));
3853 else
Tim Peterscba30e22003-02-01 06:24:36 +00003854 self->marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003855 s * sizeof(int));
3856 if (! self->marks) {
3857 PyErr_NoMemory();
3858 return -1;
3859 }
3860 self->marks_size = s;
3861 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003862
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003863 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003865 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003866}
3867
Guido van Rossum60456fd1997-04-09 17:36:32 +00003868static int
Tim Peterscba30e22003-02-01 06:24:36 +00003869load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003870{
3871 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003872
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003873 PDATA_POP(self->stack, arg_tup);
3874 if (! arg_tup) return -1;
3875 PDATA_POP(self->stack, callable);
3876 if (callable) {
3877 ob = Instance_New(callable, arg_tup);
3878 Py_DECREF(callable);
3879 }
3880 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003882 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003884 PDATA_PUSH(self->stack, ob, -1);
3885 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003886}
Tim Peters84e87f32001-03-17 04:50:51 +00003887
Tim Peters4190fb82003-02-02 16:09:05 +00003888/* Just raises an error if we don't know the protocol specified. PROTO
3889 * is the first opcode for protocols >= 2.
3890 */
3891static int
3892load_proto(Unpicklerobject *self)
3893{
3894 int i;
3895 char *protobyte;
3896
3897 i = self->read_func(self, &protobyte, 1);
3898 if (i < 0)
3899 return -1;
3900
3901 i = calc_binint(protobyte, 1);
3902 /* No point checking for < 0, since calc_binint returns an unsigned
3903 * int when chewing on 1 byte.
3904 */
3905 assert(i >= 0);
3906 if (i <= CURRENT_PROTOCOL_NUMBER)
3907 return 0;
3908
3909 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
3910 return -1;
3911}
3912
Guido van Rossum60456fd1997-04-09 17:36:32 +00003913static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003914load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003915{
3916 PyObject *err = 0, *val = 0;
3917 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003918
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003919 self->num_marks = 0;
3920 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003921
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003922 while (1) {
3923 if ((*self->read_func)(self, &s, 1) < 0)
3924 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003926 switch (s[0]) {
3927 case NONE:
3928 if (load_none(self) < 0)
3929 break;
3930 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003931
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003932 case BININT:
3933 if (load_binint(self) < 0)
3934 break;
3935 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003936
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003937 case BININT1:
3938 if (load_binint1(self) < 0)
3939 break;
3940 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003942 case BININT2:
3943 if (load_binint2(self) < 0)
3944 break;
3945 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003947 case INT:
3948 if (load_int(self) < 0)
3949 break;
3950 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003951
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003952 case LONG:
3953 if (load_long(self) < 0)
3954 break;
3955 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003956
Tim Petersee1a53c2003-02-02 02:57:53 +00003957 case LONG1:
3958 if (load_counted_long(self, 1) < 0)
3959 break;
3960 continue;
3961
3962 case LONG4:
3963 if (load_counted_long(self, 4) < 0)
3964 break;
3965 continue;
3966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003967 case FLOAT:
3968 if (load_float(self) < 0)
3969 break;
3970 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003971
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003972 case BINFLOAT:
3973 if (load_binfloat(self) < 0)
3974 break;
3975 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003976
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003977 case BINSTRING:
3978 if (load_binstring(self) < 0)
3979 break;
3980 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003981
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003982 case SHORT_BINSTRING:
3983 if (load_short_binstring(self) < 0)
3984 break;
3985 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003986
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003987 case STRING:
3988 if (load_string(self) < 0)
3989 break;
3990 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003991
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003992#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003993 case UNICODE:
3994 if (load_unicode(self) < 0)
3995 break;
3996 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003997
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003998 case BINUNICODE:
3999 if (load_binunicode(self) < 0)
4000 break;
4001 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004002#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004004 case EMPTY_TUPLE:
4005 if (load_empty_tuple(self) < 0)
4006 break;
4007 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004008
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004009 case TUPLE:
4010 if (load_tuple(self) < 0)
4011 break;
4012 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004014 case EMPTY_LIST:
4015 if (load_empty_list(self) < 0)
4016 break;
4017 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004018
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004019 case LIST:
4020 if (load_list(self) < 0)
4021 break;
4022 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004024 case EMPTY_DICT:
4025 if (load_empty_dict(self) < 0)
4026 break;
4027 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004028
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004029 case DICT:
4030 if (load_dict(self) < 0)
4031 break;
4032 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004034 case OBJ:
4035 if (load_obj(self) < 0)
4036 break;
4037 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004039 case INST:
4040 if (load_inst(self) < 0)
4041 break;
4042 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004043
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004044 case GLOBAL:
4045 if (load_global(self) < 0)
4046 break;
4047 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004048
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004049 case APPEND:
4050 if (load_append(self) < 0)
4051 break;
4052 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004053
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004054 case APPENDS:
4055 if (load_appends(self) < 0)
4056 break;
4057 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004059 case BUILD:
4060 if (load_build(self) < 0)
4061 break;
4062 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004063
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004064 case DUP:
4065 if (load_dup(self) < 0)
4066 break;
4067 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004069 case BINGET:
4070 if (load_binget(self) < 0)
4071 break;
4072 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004073
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004074 case LONG_BINGET:
4075 if (load_long_binget(self) < 0)
4076 break;
4077 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004078
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004079 case GET:
4080 if (load_get(self) < 0)
4081 break;
4082 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004084 case MARK:
4085 if (load_mark(self) < 0)
4086 break;
4087 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004089 case BINPUT:
4090 if (load_binput(self) < 0)
4091 break;
4092 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004093
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004094 case LONG_BINPUT:
4095 if (load_long_binput(self) < 0)
4096 break;
4097 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004099 case PUT:
4100 if (load_put(self) < 0)
4101 break;
4102 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004103
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004104 case POP:
4105 if (load_pop(self) < 0)
4106 break;
4107 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004109 case POP_MARK:
4110 if (load_pop_mark(self) < 0)
4111 break;
4112 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004114 case SETITEM:
4115 if (load_setitem(self) < 0)
4116 break;
4117 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004119 case SETITEMS:
4120 if (load_setitems(self) < 0)
4121 break;
4122 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004123
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004124 case STOP:
4125 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004127 case PERSID:
4128 if (load_persid(self) < 0)
4129 break;
4130 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004132 case BINPERSID:
4133 if (load_binpersid(self) < 0)
4134 break;
4135 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004136
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004137 case REDUCE:
4138 if (load_reduce(self) < 0)
4139 break;
4140 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004141
Tim Peters4190fb82003-02-02 16:09:05 +00004142 case PROTO:
4143 if (load_proto(self) < 0)
4144 break;
4145 continue;
4146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004147 case '\0':
4148 /* end of file */
4149 PyErr_SetNone(PyExc_EOFError);
4150 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004152 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004153 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004154 "invalid load key, '%s'.",
4155 "c", s[0]);
4156 return NULL;
4157 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004159 break;
4160 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004162 if ((err = PyErr_Occurred())) {
4163 if (err == PyExc_EOFError) {
4164 PyErr_SetNone(PyExc_EOFError);
4165 }
4166 return NULL;
4167 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004168
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004169 PDATA_POP(self->stack, val);
4170 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004171}
Tim Peters84e87f32001-03-17 04:50:51 +00004172
Guido van Rossum60456fd1997-04-09 17:36:32 +00004173
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004174/* No-load functions to support noload, which is used to
4175 find persistent references. */
4176
4177static int
Tim Peterscba30e22003-02-01 06:24:36 +00004178noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004179{
4180 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004182 if ((i = marker(self)) < 0) return -1;
4183 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004184}
4185
4186
4187static int
Tim Peterscba30e22003-02-01 06:24:36 +00004188noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004189{
4190 int i;
4191 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004193 if ((i = marker(self)) < 0) return -1;
4194 Pdata_clear(self->stack, i);
4195 if ((*self->readline_func)(self, &s) < 0) return -1;
4196 if ((*self->readline_func)(self, &s) < 0) return -1;
4197 PDATA_APPEND(self->stack, Py_None,-1);
4198 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004199}
4200
4201static int
Tim Peterscba30e22003-02-01 06:24:36 +00004202noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004203{
4204 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004206 if ((*self->readline_func)(self, &s) < 0) return -1;
4207 if ((*self->readline_func)(self, &s) < 0) return -1;
4208 PDATA_APPEND(self->stack, Py_None,-1);
4209 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004210}
4211
4212static int
Tim Peterscba30e22003-02-01 06:24:36 +00004213noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004214{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004216 if (self->stack->length < 2) return stackUnderflow();
4217 Pdata_clear(self->stack, self->stack->length-2);
4218 PDATA_APPEND(self->stack, Py_None,-1);
4219 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004220}
4221
4222static int
4223noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004224
Guido van Rossum053b8df1998-11-25 16:18:00 +00004225 if (self->stack->length < 1) return stackUnderflow();
4226 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004227 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004228}
4229
4230
4231static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004232noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004233{
4234 PyObject *err = 0, *val = 0;
4235 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004236
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004237 self->num_marks = 0;
4238 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004239
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004240 while (1) {
4241 if ((*self->read_func)(self, &s, 1) < 0)
4242 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004243
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004244 switch (s[0]) {
4245 case NONE:
4246 if (load_none(self) < 0)
4247 break;
4248 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004249
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004250 case BININT:
4251 if (load_binint(self) < 0)
4252 break;
4253 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004254
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004255 case BININT1:
4256 if (load_binint1(self) < 0)
4257 break;
4258 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004259
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004260 case BININT2:
4261 if (load_binint2(self) < 0)
4262 break;
4263 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004265 case INT:
4266 if (load_int(self) < 0)
4267 break;
4268 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004269
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004270 case LONG:
4271 if (load_long(self) < 0)
4272 break;
4273 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004274
Tim Peters4190fb82003-02-02 16:09:05 +00004275 case LONG1:
4276 if (load_counted_long(self, 1) < 0)
4277 break;
4278 continue;
4279
4280 case LONG4:
4281 if (load_counted_long(self, 4) < 0)
4282 break;
4283 continue;
4284
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004285 case FLOAT:
4286 if (load_float(self) < 0)
4287 break;
4288 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004289
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004290 case BINFLOAT:
4291 if (load_binfloat(self) < 0)
4292 break;
4293 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004294
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004295 case BINSTRING:
4296 if (load_binstring(self) < 0)
4297 break;
4298 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004300 case SHORT_BINSTRING:
4301 if (load_short_binstring(self) < 0)
4302 break;
4303 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004304
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004305 case STRING:
4306 if (load_string(self) < 0)
4307 break;
4308 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004309
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004310#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004311 case UNICODE:
4312 if (load_unicode(self) < 0)
4313 break;
4314 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004315
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004316 case BINUNICODE:
4317 if (load_binunicode(self) < 0)
4318 break;
4319 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004320#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004322 case EMPTY_TUPLE:
4323 if (load_empty_tuple(self) < 0)
4324 break;
4325 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004326
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004327 case TUPLE:
4328 if (load_tuple(self) < 0)
4329 break;
4330 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004331
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004332 case EMPTY_LIST:
4333 if (load_empty_list(self) < 0)
4334 break;
4335 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004336
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004337 case LIST:
4338 if (load_list(self) < 0)
4339 break;
4340 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004342 case EMPTY_DICT:
4343 if (load_empty_dict(self) < 0)
4344 break;
4345 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004347 case DICT:
4348 if (load_dict(self) < 0)
4349 break;
4350 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004351
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004352 case OBJ:
4353 if (noload_obj(self) < 0)
4354 break;
4355 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004356
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004357 case INST:
4358 if (noload_inst(self) < 0)
4359 break;
4360 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004362 case GLOBAL:
4363 if (noload_global(self) < 0)
4364 break;
4365 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004366
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004367 case APPEND:
4368 if (load_append(self) < 0)
4369 break;
4370 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004372 case APPENDS:
4373 if (load_appends(self) < 0)
4374 break;
4375 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004377 case BUILD:
4378 if (noload_build(self) < 0)
4379 break;
4380 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004382 case DUP:
4383 if (load_dup(self) < 0)
4384 break;
4385 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004387 case BINGET:
4388 if (load_binget(self) < 0)
4389 break;
4390 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004391
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004392 case LONG_BINGET:
4393 if (load_long_binget(self) < 0)
4394 break;
4395 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004397 case GET:
4398 if (load_get(self) < 0)
4399 break;
4400 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004402 case MARK:
4403 if (load_mark(self) < 0)
4404 break;
4405 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004407 case BINPUT:
4408 if (load_binput(self) < 0)
4409 break;
4410 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004411
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004412 case LONG_BINPUT:
4413 if (load_long_binput(self) < 0)
4414 break;
4415 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004417 case PUT:
4418 if (load_put(self) < 0)
4419 break;
4420 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004421
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004422 case POP:
4423 if (load_pop(self) < 0)
4424 break;
4425 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004427 case POP_MARK:
4428 if (load_pop_mark(self) < 0)
4429 break;
4430 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004431
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004432 case SETITEM:
4433 if (load_setitem(self) < 0)
4434 break;
4435 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004437 case SETITEMS:
4438 if (load_setitems(self) < 0)
4439 break;
4440 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004441
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004442 case STOP:
4443 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004445 case PERSID:
4446 if (load_persid(self) < 0)
4447 break;
4448 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004450 case BINPERSID:
4451 if (load_binpersid(self) < 0)
4452 break;
4453 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004454
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004455 case REDUCE:
4456 if (noload_reduce(self) < 0)
4457 break;
4458 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004459
Tim Peters4190fb82003-02-02 16:09:05 +00004460 case PROTO:
4461 if (load_proto(self) < 0)
4462 break;
4463 continue;
4464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004465 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004466 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004467 "invalid load key, '%s'.",
4468 "c", s[0]);
4469 return NULL;
4470 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004472 break;
4473 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004474
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004475 if ((err = PyErr_Occurred())) {
4476 if (err == PyExc_EOFError) {
4477 PyErr_SetNone(PyExc_EOFError);
4478 }
4479 return NULL;
4480 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004481
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004482 PDATA_POP(self->stack, val);
4483 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004484}
Tim Peters84e87f32001-03-17 04:50:51 +00004485
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004486
Guido van Rossum60456fd1997-04-09 17:36:32 +00004487static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004488Unpickler_load(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004489{
Tim Peterscba30e22003-02-01 06:24:36 +00004490 if (!( PyArg_ParseTuple(args, ":load")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004491 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004493 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004494}
4495
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004496static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004497Unpickler_noload(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004498{
Tim Peterscba30e22003-02-01 06:24:36 +00004499 if (!( PyArg_ParseTuple(args, ":noload")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004500 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004501
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004502 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004503}
4504
Guido van Rossum60456fd1997-04-09 17:36:32 +00004505
4506static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004507 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004508 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004509 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004510 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004511 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004512 "noload() -- not load a pickle, but go through most of the motions\n"
4513 "\n"
4514 "This function can be used to read past a pickle without instantiating\n"
4515 "any objects or importing any modules. It can also be used to find all\n"
4516 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004517 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004518 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004519 {NULL, NULL} /* sentinel */
4520};
4521
4522
4523static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004524newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004525{
4526 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004527
Tim Peterscba30e22003-02-01 06:24:36 +00004528 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004529 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004530
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004531 self->file = NULL;
4532 self->arg = NULL;
4533 self->stack = (Pdata*)Pdata_New();
4534 self->pers_func = NULL;
4535 self->last_string = NULL;
4536 self->marks = NULL;
4537 self->num_marks = 0;
4538 self->marks_size = 0;
4539 self->buf_size = 0;
4540 self->read = NULL;
4541 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004542 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004543
Tim Peterscba30e22003-02-01 06:24:36 +00004544 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004545 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004546
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004547 Py_INCREF(f);
4548 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004549
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004550 /* Set read, readline based on type of f */
4551 if (PyFile_Check(f)) {
4552 self->fp = PyFile_AsFile(f);
4553 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00004554 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004555 "I/O operation on closed file");
4556 goto err;
4557 }
4558 self->read_func = read_file;
4559 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004560 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004561 else if (PycStringIO_InputCheck(f)) {
4562 self->fp = NULL;
4563 self->read_func = read_cStringIO;
4564 self->readline_func = readline_cStringIO;
4565 }
4566 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004567
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004568 self->fp = NULL;
4569 self->read_func = read_other;
4570 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004571
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004572 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4573 (self->read = PyObject_GetAttr(f, read_str)))) {
4574 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00004575 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004576 "argument must have 'read' and "
4577 "'readline' attributes" );
4578 goto err;
4579 }
4580 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004581
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004582 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004583
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004584 err:
4585 Py_DECREF((PyObject *)self);
4586 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004587}
4588
4589
4590static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004591get_Unpickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004592{
4593 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004594
Tim Peterscba30e22003-02-01 06:24:36 +00004595 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004596 return NULL;
4597 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004598}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004599
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004600
Guido van Rossum60456fd1997-04-09 17:36:32 +00004601static void
Tim Peterscba30e22003-02-01 06:24:36 +00004602Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004603{
4604 Py_XDECREF(self->readline);
4605 Py_XDECREF(self->read);
4606 Py_XDECREF(self->file);
4607 Py_XDECREF(self->memo);
4608 Py_XDECREF(self->stack);
4609 Py_XDECREF(self->pers_func);
4610 Py_XDECREF(self->arg);
4611 Py_XDECREF(self->last_string);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004613 if (self->marks) {
4614 free(self->marks);
4615 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004617 if (self->buf_size) {
4618 free(self->buf);
4619 }
Tim Peters84e87f32001-03-17 04:50:51 +00004620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004621 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004622}
4623
4624
4625static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004626Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004627{
4628 if (!strcmp(name, "persistent_load")) {
4629 if (!self->pers_func) {
4630 PyErr_SetString(PyExc_AttributeError, name);
4631 return NULL;
4632 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004633
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004634 Py_INCREF(self->pers_func);
4635 return self->pers_func;
4636 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004637
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004638 if (!strcmp(name, "find_global")) {
4639 if (!self->find_class) {
4640 PyErr_SetString(PyExc_AttributeError, name);
4641 return NULL;
4642 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004644 Py_INCREF(self->find_class);
4645 return self->find_class;
4646 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004648 if (!strcmp(name, "memo")) {
4649 if (!self->memo) {
4650 PyErr_SetString(PyExc_AttributeError, name);
4651 return NULL;
4652 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004654 Py_INCREF(self->memo);
4655 return self->memo;
4656 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004657
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004658 if (!strcmp(name, "UnpicklingError")) {
4659 Py_INCREF(UnpicklingError);
4660 return UnpicklingError;
4661 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004662
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004663 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004664}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004665
Guido van Rossum60456fd1997-04-09 17:36:32 +00004666
4667static int
Tim Peterscba30e22003-02-01 06:24:36 +00004668Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004669{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004671 if (!strcmp(name, "persistent_load")) {
4672 Py_XDECREF(self->pers_func);
4673 self->pers_func = value;
4674 Py_XINCREF(value);
4675 return 0;
4676 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004677
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004678 if (!strcmp(name, "find_global")) {
4679 Py_XDECREF(self->find_class);
4680 self->find_class = value;
4681 Py_XINCREF(value);
4682 return 0;
4683 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004685 if (! value) {
4686 PyErr_SetString(PyExc_TypeError,
4687 "attribute deletion is not supported");
4688 return -1;
4689 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004691 if (strcmp(name, "memo") == 0) {
4692 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00004693 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004694 "memo must be a dictionary");
4695 return -1;
4696 }
4697 Py_XDECREF(self->memo);
4698 self->memo = value;
4699 Py_INCREF(value);
4700 return 0;
4701 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004703 PyErr_SetString(PyExc_AttributeError, name);
4704 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004705}
4706
Tim Peters5bd2a792003-02-01 16:45:06 +00004707/* ---------------------------------------------------------------------------
4708 * Module-level functions.
4709 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004710
Tim Peters5bd2a792003-02-01 16:45:06 +00004711/* dump(obj, file, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004712static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004713cpm_dump(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004714{
4715 PyObject *ob, *file, *res = NULL;
4716 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00004717 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004718
Tim Peters5bd2a792003-02-01 16:45:06 +00004719 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004720 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004721
Tim Peters5bd2a792003-02-01 16:45:06 +00004722 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004723 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004724
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004725 if (dump(pickler, ob) < 0)
4726 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004727
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004728 Py_INCREF(Py_None);
4729 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004730
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004731 finally:
4732 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004733
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004734 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004735}
4736
4737
Tim Peters5bd2a792003-02-01 16:45:06 +00004738/* dumps(obj, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004739static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004740cpm_dumps(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004741{
4742 PyObject *ob, *file = 0, *res = NULL;
4743 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00004744 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004745
Tim Peters5bd2a792003-02-01 16:45:06 +00004746 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004747 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004748
Tim Peterscba30e22003-02-01 06:24:36 +00004749 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004750 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004751
Tim Peters5bd2a792003-02-01 16:45:06 +00004752 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004753 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004754
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004755 if (dump(pickler, ob) < 0)
4756 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004758 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004760 finally:
4761 Py_XDECREF(pickler);
4762 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004764 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004765}
4766
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004767
Tim Peters5bd2a792003-02-01 16:45:06 +00004768/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004769static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004770cpm_load(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004771{
4772 Unpicklerobject *unpickler = 0;
4773 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004774
Tim Peterscba30e22003-02-01 06:24:36 +00004775 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004776 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004777
Tim Peterscba30e22003-02-01 06:24:36 +00004778 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004779 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004781 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004783 finally:
4784 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004785
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004786 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004787}
4788
4789
Tim Peters5bd2a792003-02-01 16:45:06 +00004790/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004791static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004792cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004793{
4794 PyObject *ob, *file = 0, *res = NULL;
4795 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004796
Tim Peterscba30e22003-02-01 06:24:36 +00004797 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004798 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004799
Tim Peterscba30e22003-02-01 06:24:36 +00004800 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004801 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004802
Tim Peterscba30e22003-02-01 06:24:36 +00004803 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004804 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004806 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004808 finally:
4809 Py_XDECREF(file);
4810 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004811
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004812 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004813}
4814
4815
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004816PyDoc_STRVAR(Unpicklertype__doc__,
4817"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004818
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004819static PyTypeObject Unpicklertype = {
4820 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004821 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004822 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004823 sizeof(Unpicklerobject), /*tp_basicsize*/
4824 0, /*tp_itemsize*/
4825 /* methods */
4826 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4827 (printfunc)0, /*tp_print*/
4828 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4829 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4830 (cmpfunc)0, /*tp_compare*/
4831 (reprfunc)0, /*tp_repr*/
4832 0, /*tp_as_number*/
4833 0, /*tp_as_sequence*/
4834 0, /*tp_as_mapping*/
4835 (hashfunc)0, /*tp_hash*/
4836 (ternaryfunc)0, /*tp_call*/
4837 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004838
Guido van Rossum60456fd1997-04-09 17:36:32 +00004839 /* Space for future expansion */
4840 0L,0L,0L,0L,
4841 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004842};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004843
Guido van Rossum60456fd1997-04-09 17:36:32 +00004844static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004845 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004846 PyDoc_STR("dump(object, file, proto=0) -- "
4847 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004848 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00004849 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004850 },
Tim Peters5bd2a792003-02-01 16:45:06 +00004851
Neal Norwitzb0493252002-03-31 14:44:22 +00004852 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004853 PyDoc_STR("dumps(object, proto=0) -- "
4854 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004855 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00004856 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004857 },
Tim Peters5bd2a792003-02-01 16:45:06 +00004858
Neal Norwitzb0493252002-03-31 14:44:22 +00004859 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004860 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00004861
Neal Norwitzb0493252002-03-31 14:44:22 +00004862 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004863 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00004864
Neal Norwitzb0493252002-03-31 14:44:22 +00004865 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004866 PyDoc_STR("Pickler(file, proto=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004867 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00004868 "This takes a file-like object for writing a pickle data stream.\n"
4869 "The optional proto argument tells the pickler to use the given\n"
4870 "protocol; supported protocols are 0, 1, 2. The default\n"
4871 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
4872 "only protocol that can be written to a file opened in text\n"
4873 "mode and read back successfully. When using a protocol higher\n"
4874 "than 0, make sure the file is opened in binary mode, both when\n"
4875 "pickling and unpickling.)\n"
4876 "\n"
4877 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
4878 "more efficient than protocol 1.\n"
4879 "\n"
4880 "Specifying a negative protocol version selects the highest\n"
4881 "protocol version supported. The higher the protocol used, the\n"
4882 "more recent the version of Python needed to read the pickle\n"
4883 "produced.\n"
4884 "\n"
4885 "The file parameter must have a write() method that accepts a single\n"
4886 "string argument. It can thus be an open file object, a StringIO\n"
4887 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004888 },
Tim Peters5bd2a792003-02-01 16:45:06 +00004889
Neal Norwitzb0493252002-03-31 14:44:22 +00004890 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004891 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
4892
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004893 { NULL, NULL }
4894};
4895
Guido van Rossum60456fd1997-04-09 17:36:32 +00004896static int
Tim Peterscba30e22003-02-01 06:24:36 +00004897init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004898{
4899 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004900
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00004901#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004902
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004903 INIT_STR(__class__);
4904 INIT_STR(__getinitargs__);
4905 INIT_STR(__dict__);
4906 INIT_STR(__getstate__);
4907 INIT_STR(__setstate__);
4908 INIT_STR(__name__);
4909 INIT_STR(__main__);
4910 INIT_STR(__reduce__);
4911 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004912 INIT_STR(append);
4913 INIT_STR(read);
4914 INIT_STR(readline);
4915 INIT_STR(copy_reg);
4916 INIT_STR(dispatch_table);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004917 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004918
Tim Peterscba30e22003-02-01 06:24:36 +00004919 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004920 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004921
Tim Peters1f1b2d22003-02-01 02:16:37 +00004922 /* This is special because we want to use a different
4923 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004924 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peterscba30e22003-02-01 06:24:36 +00004925 if (!dispatch_table)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004926 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004927
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004928 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004929
Tim Peterscba30e22003-02-01 06:24:36 +00004930 if (!( empty_tuple = PyTuple_New(0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004931 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004932
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004933 /* Ugh */
4934 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
4935 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4936 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004938 if (!( t=PyDict_New())) return -1;
4939 if (!( r=PyRun_String(
4940 "def __init__(self, *args): self.args=args\n\n"
4941 "def __str__(self):\n"
4942 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4943 Py_file_input,
4944 module_dict, t) )) return -1;
4945 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004947 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00004948 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004949 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004950
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004951 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004952
Tim Peterscba30e22003-02-01 06:24:36 +00004953 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004954 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00004955 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004956 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004958 if (!( t=PyDict_New())) return -1;
4959 if (!( r=PyRun_String(
4960 "def __init__(self, *args): self.args=args\n\n"
4961 "def __str__(self):\n"
4962 " a=self.args\n"
4963 " a=a and type(a[0]) or '(what)'\n"
4964 " return 'Cannot pickle %s objects' % a\n"
4965 , Py_file_input,
4966 module_dict, t) )) return -1;
4967 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00004968
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004969 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00004970 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004971 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004972
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004973 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004974
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004975 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00004976 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004977 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004978
Martin v. Löwis658009a2002-09-16 17:26:24 +00004979 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
4980 UnpicklingError, NULL)))
4981 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00004982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004983 if (PyDict_SetItemString(module_dict, "PickleError",
4984 PickleError) < 0)
4985 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004986
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004987 if (PyDict_SetItemString(module_dict, "PicklingError",
4988 PicklingError) < 0)
4989 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004990
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004991 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4992 UnpicklingError) < 0)
4993 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004994
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004995 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4996 UnpickleableError) < 0)
4997 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004998
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004999 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5000 BadPickleGet) < 0)
5001 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005002
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005003 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005004
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005005 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005006}
5007
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005008#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5009#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005010#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005011PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005012initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005013{
5014 PyObject *m, *d, *di, *v, *k;
5015 int i;
5016 char *rev="1.71";
5017 PyObject *format_version;
5018 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005019
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005020 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005021 Unpicklertype.ob_type = &PyType_Type;
5022 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005024 /* Initialize some pieces. We need to do this before module creation,
5025 so we're forced to use a temporary dictionary. :(
5026 */
5027 di=PyDict_New();
5028 if (!di) return;
5029 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005031 /* Create the module and add the functions */
5032 m = Py_InitModule4("cPickle", cPickle_methods,
5033 cPickle_module_documentation,
5034 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005035
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005036 /* Add some symbolic constants to the module */
5037 d = PyModule_GetDict(m);
5038 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
5039 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005040
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005041 /* Copy data from di. Waaa. */
5042 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5043 if (PyObject_SetItem(d, k, v) < 0) {
5044 Py_DECREF(di);
5045 return;
5046 }
5047 }
5048 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005049
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005050 format_version = PyString_FromString("1.3");
5051 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005052
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005053 PyDict_SetItemString(d, "format_version", format_version);
5054 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5055 Py_XDECREF(format_version);
5056 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005057}