blob: 215157ed1b7b5fda1adcb884dd3eb9742f424240 [file] [log] [blame]
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001#include "Python.h"
2#include "cStringIO.h"
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003#include "structmember.h"
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005PyDoc_STRVAR(cPickle_module_documentation,
Tim Peters64c04d12003-02-01 06:27:59 +00006"C implementation and optimization of the Python pickle module.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00007
Guido van Rossum142eeb81997-08-13 03:14:41 +00008#ifndef Py_eval_input
9#include <graminit.h>
10#define Py_eval_input eval_input
Guido van Rossumc6ef2041997-08-21 02:30:45 +000011#endif /* Py_eval_input */
Guido van Rossum142eeb81997-08-13 03:14:41 +000012
Guido van Rossum60456fd1997-04-09 17:36:32 +000013#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000014
Guido van Rossum60456fd1997-04-09 17:36:32 +000015#define WRITE_BUF_SIZE 256
16
Tim Peters5bd2a792003-02-01 16:45:06 +000017/* Bump this when new opcodes are added to the pickle protocol. */
18#define CURRENT_PROTOCOL_NUMBER 2
19
Tim Peters797ec242003-02-01 06:22:36 +000020/*
21 * Pickle opcodes. These must be kept in synch with pickle.py. Extensive
22 * docs are in pickletools.py.
23 */
Guido van Rossum60456fd1997-04-09 17:36:32 +000024#define MARK '('
25#define STOP '.'
26#define POP '0'
27#define POP_MARK '1'
28#define DUP '2'
29#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000030#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000031#define INT 'I'
32#define BININT 'J'
33#define BININT1 'K'
34#define LONG 'L'
35#define BININT2 'M'
36#define NONE 'N'
37#define PERSID 'P'
38#define BINPERSID 'Q'
39#define REDUCE 'R'
40#define STRING 'S'
41#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +000042#define SHORT_BINSTRING 'U'
Guido van Rossum5fccb7c2000-03-10 23:11:40 +000043#define UNICODE 'V'
44#define BINUNICODE 'X'
Guido van Rossum60456fd1997-04-09 17:36:32 +000045#define APPEND 'a'
46#define BUILD 'b'
47#define GLOBAL 'c'
48#define DICT 'd'
49#define EMPTY_DICT '}'
50#define APPENDS 'e'
51#define GET 'g'
52#define BINGET 'h'
53#define INST 'i'
54#define LONG_BINGET 'j'
55#define LIST 'l'
56#define EMPTY_LIST ']'
57#define OBJ 'o'
58#define PUT 'p'
59#define BINPUT 'q'
60#define LONG_BINPUT 'r'
61#define SETITEM 's'
62#define TUPLE 't'
63#define EMPTY_TUPLE ')'
64#define SETITEMS 'u'
Tim Peters797ec242003-02-01 06:22:36 +000065
66/* Protocol 2. */
67#define PROTO '\x80' /* identify pickle protocol */
68#define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */
69#define EXT1 '\x82' /* push object from extension registry; 1-byte index */
70#define EXT2 '\x83' /* ditto, but 2-byte index */
71#define EXT4 '\x84' /* ditto, but 4-byte index */
72#define TUPLE1 '\x85' /* build 1-tuple from stack top */
73#define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */
74#define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */
75#define NEWTRUE '\x88' /* push True */
76#define NEWFALSE '\x89' /* push False */
77#define LONG1 '\x8a' /* push long from < 256 bytes */
78#define LONG4 '\x8b' /* push really big long */
79
80/* There aren't opcodes -- they're ways to pickle bools before protocol 2,
81 * so that unpicklers written before bools were introduced unpickle them
82 * as ints, but unpicklers after can recognize that bools were intended.
83 * Note that protocol 2 added direct ways to pickle bools.
84 */
Jack Jansen3a967022002-06-26 20:40:42 +000085#undef TRUE
Guido van Rossume2763392002-04-05 19:30:08 +000086#define TRUE "I01\n"
Jack Jansen3a967022002-06-26 20:40:42 +000087#undef FALSE
Guido van Rossume2763392002-04-05 19:30:08 +000088#define FALSE "I00\n"
Guido van Rossum77f6a652002-04-03 22:41:51 +000089
Guido van Rossum60456fd1997-04-09 17:36:32 +000090static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000091
Guido van Rossumc03158b1999-06-09 15:23:31 +000092static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000093static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +000094static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000095static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +000096static PyObject *BadPickleGet;
97
Guido van Rossum2f4caa41997-01-06 22:59:08 +000098
Guido van Rossum60456fd1997-04-09 17:36:32 +000099static PyObject *dispatch_table;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000100static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000101
Guido van Rossum60456fd1997-04-09 17:36:32 +0000102static PyObject *__class___str, *__getinitargs___str, *__dict___str,
103 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000104 *write_str, *append_str,
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000105 *read_str, *readline_str, *__main___str, *__basicnew___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000106 *copy_reg_str, *dispatch_table_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000107
Guido van Rossum053b8df1998-11-25 16:18:00 +0000108/*************************************************************************
109 Internal Data type for pickle data. */
110
111typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000112 PyObject_HEAD
113 int length, size;
114 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000115} Pdata;
116
Tim Peters84e87f32001-03-17 04:50:51 +0000117static void
Tim Peterscba30e22003-02-01 06:24:36 +0000118Pdata_dealloc(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000119{
120 int i;
121 PyObject **p;
Tim Peterscba30e22003-02-01 06:24:36 +0000122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000123 for (i=self->length, p=self->data; --i >= 0; p++) Py_DECREF(*p);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000125 if (self->data) free(self->data);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000127 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000128}
129
130static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000131 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
132 (destructor)Pdata_dealloc,
133 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000134};
135
136#define Pdata_Check(O) ((O)->ob_type == &PdataType)
137
138static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000139Pdata_New(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000140{
141 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000142
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000143 if (!( self = PyObject_New(Pdata, &PdataType))) return NULL;
144 self->size=8;
145 self->length=0;
146 self->data=malloc(self->size * sizeof(PyObject*));
147 if (self->data) return (PyObject*)self;
148 Py_DECREF(self);
149 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000150}
151
Tim Peters84e87f32001-03-17 04:50:51 +0000152static int
Tim Peterscba30e22003-02-01 06:24:36 +0000153stackUnderflow(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000154{
155 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
156 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000157}
158
159static int
Tim Peterscba30e22003-02-01 06:24:36 +0000160Pdata_clear(Pdata *self, int clearto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000161{
162 int i;
163 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000165 if (clearto < 0) return stackUnderflow();
166 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000168 for (i=self->length, p=self->data+clearto; --i >= clearto; p++)
169 Py_DECREF(*p);
170 self->length=clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000172 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000173}
174
175
Tim Peters84e87f32001-03-17 04:50:51 +0000176static int
Tim Peterscba30e22003-02-01 06:24:36 +0000177Pdata_grow(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000178{
179 if (! self->size) {
180 PyErr_NoMemory();
181 return -1;
182 }
183 self->size *= 2;
184 self->data = realloc(self->data, self->size*sizeof(PyObject*));
185 if (! self->data) {
186 self->size = 0;
187 PyErr_NoMemory();
188 return -1;
189 }
190 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +0000191}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000192
193#define PDATA_POP(D,V) { \
194 if ((D)->length) V=D->data[--((D)->length)]; \
195 else { \
196 PyErr_SetString(UnpicklingError, "bad pickle data"); \
197 V=NULL; \
198 } \
199}
200
201
202static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000203Pdata_popTuple(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000204{
205 PyObject *r;
206 int i, j, l;
Tim Peterscba30e22003-02-01 06:24:36 +0000207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000208 l=self->length-start;
209 if (!( r=PyTuple_New(l))) return NULL;
210 for (i=start, j=0 ; j < l; i++, j++)
211 PyTuple_SET_ITEM(r, j, self->data[i]);
Tim Peterscba30e22003-02-01 06:24:36 +0000212
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000213 self->length=start;
214 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000215}
216
217static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000218Pdata_popList(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000219{
220 PyObject *r;
221 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000222
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000223 l=self->length-start;
224 if (!( r=PyList_New(l))) return NULL;
225 for (i=start, j=0 ; j < l; i++, j++)
226 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000227
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000228 self->length=start;
229 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000230}
231
Guido van Rossum053b8df1998-11-25 16:18:00 +0000232#define PDATA_APPEND(D,O,ER) { \
233 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
234 Pdata_grow((Pdata*)(D)) < 0) \
235 return ER; \
236 Py_INCREF(O); \
237 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
238}
239
240#define PDATA_PUSH(D,O,ER) { \
241 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
242 Pdata_grow((Pdata*)(D)) < 0) { \
243 Py_DECREF(O); \
244 return ER; \
245 } \
246 ((Pdata*)(D))->data[((Pdata*)(D))->length++]=O; \
247}
248
249/*************************************************************************/
250
251#define ARG_TUP(self, o) { \
252 if (self->arg || (self->arg=PyTuple_New(1))) { \
253 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
254 PyTuple_SET_ITEM(self->arg,0,o); \
255 } \
256 else { \
257 Py_DECREF(o); \
258 } \
259}
260
261#define FREE_ARG_TUP(self) { \
262 if (self->arg->ob_refcnt > 1) { \
263 Py_DECREF(self->arg); \
264 self->arg=NULL; \
265 } \
266 }
267
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000268typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000269 PyObject_HEAD
270 FILE *fp;
271 PyObject *write;
272 PyObject *file;
273 PyObject *memo;
274 PyObject *arg;
275 PyObject *pers_func;
276 PyObject *inst_pers_func;
Tim Peters797ec242003-02-01 06:22:36 +0000277
278 /* pickle protocol number, >= 0 */
279 int proto;
280
281 /* bool, true if proto > 0 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000282 int bin;
Tim Peters797ec242003-02-01 06:22:36 +0000283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000284 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis5a395302002-08-04 08:20:23 +0000285 int nesting;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000286 int (*write_func)(struct Picklerobject *, char *, int);
287 char *write_buf;
288 int buf_size;
289 PyObject *dispatch_table;
290 int fast_container; /* count nested container dumps */
291 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000292} Picklerobject;
293
Barry Warsaw52acb492001-12-21 20:04:22 +0000294#ifndef PY_CPICKLE_FAST_LIMIT
295#define PY_CPICKLE_FAST_LIMIT 50
296#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000297
Jeremy Hylton938ace62002-07-17 16:30:39 +0000298static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000299
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000300typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000301 PyObject_HEAD
302 FILE *fp;
303 PyObject *file;
304 PyObject *readline;
305 PyObject *read;
306 PyObject *memo;
307 PyObject *arg;
308 Pdata *stack;
309 PyObject *mark;
310 PyObject *pers_func;
311 PyObject *last_string;
312 int *marks;
313 int num_marks;
314 int marks_size;
315 int (*read_func)(struct Unpicklerobject *, char **, int);
316 int (*readline_func)(struct Unpicklerobject *, char **);
317 int buf_size;
318 char *buf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000319 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000320} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000321
Jeremy Hylton938ace62002-07-17 16:30:39 +0000322static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000323
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000324/* Forward decls that need the above structs */
325static int save(Picklerobject *, PyObject *, int);
326static int put2(Picklerobject *, PyObject *);
327
Tim Peters84e87f32001-03-17 04:50:51 +0000328int
Tim Peterscba30e22003-02-01 06:24:36 +0000329cPickle_PyMapping_HasKey(PyObject *o, PyObject *key)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000330{
331 PyObject *v;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000332
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000333 if ((v = PyObject_GetItem(o,key))) {
334 Py_DECREF(v);
335 return 1;
336 }
Tim Peterscba30e22003-02-01 06:24:36 +0000337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000338 PyErr_Clear();
339 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000340}
341
Guido van Rossumd385d591997-04-09 17:47:47 +0000342static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000343PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000344cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
345{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000346 va_list va;
347 PyObject *args=0, *retval=0;
348 va_start(va, format);
Tim Peterscba30e22003-02-01 06:24:36 +0000349
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000350 if (format) args = Py_VaBuildValue(format, va);
351 va_end(va);
352 if (format && ! args) return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000353 if (stringformat && !(retval=PyString_FromString(stringformat)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000354 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000355
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000356 if (retval) {
357 if (args) {
358 PyObject *v;
359 v=PyString_Format(retval, args);
360 Py_DECREF(retval);
361 Py_DECREF(args);
362 if (! v) return NULL;
363 retval=v;
364 }
365 }
366 else
367 if (args) retval=args;
368 else {
369 PyErr_SetObject(ErrType,Py_None);
370 return NULL;
371 }
372 PyErr_SetObject(ErrType,retval);
373 Py_DECREF(retval);
374 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000375}
376
Tim Peters84e87f32001-03-17 04:50:51 +0000377static int
Tim Peterscba30e22003-02-01 06:24:36 +0000378write_file(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000379{
380 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000382 if (s == NULL) {
383 return 0;
384 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000386 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000387 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000388 Py_END_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000389 if (nbyteswritten != (size_t)n) {
390 PyErr_SetFromErrno(PyExc_IOError);
391 return -1;
392 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000393
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000394 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000395}
396
Tim Peters84e87f32001-03-17 04:50:51 +0000397static int
Tim Peterscba30e22003-02-01 06:24:36 +0000398write_cStringIO(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000399{
400 if (s == NULL) {
401 return 0;
402 }
Tim Peterscba30e22003-02-01 06:24:36 +0000403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000404 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
405 return -1;
406 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000408 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000409}
410
Tim Peters84e87f32001-03-17 04:50:51 +0000411static int
Tim Peterscba30e22003-02-01 06:24:36 +0000412write_none(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000413{
414 if (s == NULL) return 0;
415 return n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000416}
417
Tim Peters84e87f32001-03-17 04:50:51 +0000418static int
Tim Peterscba30e22003-02-01 06:24:36 +0000419write_other(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000420{
421 PyObject *py_str = 0, *junk = 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000423 if (s == NULL) {
424 if (!( self->buf_size )) return 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000425 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000426 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000427 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000428 return -1;
429 }
430 else {
431 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
432 if (write_other(self, NULL, 0) < 0)
433 return -1;
434 }
Tim Peterscba30e22003-02-01 06:24:36 +0000435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000436 if (n > WRITE_BUF_SIZE) {
437 if (!( py_str =
Tim Peterscba30e22003-02-01 06:24:36 +0000438 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000439 return -1;
440 }
441 else {
442 memcpy(self->write_buf + self->buf_size, s, n);
443 self->buf_size += n;
444 return n;
445 }
446 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000448 if (self->write) {
449 /* object with write method */
450 ARG_TUP(self, py_str);
451 if (self->arg) {
452 junk = PyObject_Call(self->write, self->arg, NULL);
453 FREE_ARG_TUP(self);
454 }
455 if (junk) Py_DECREF(junk);
456 else return -1;
457 }
458 else
459 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000461 self->buf_size = 0;
462 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000463}
464
465
Tim Peters84e87f32001-03-17 04:50:51 +0000466static int
Tim Petersee1a53c2003-02-02 02:57:53 +0000467read_file(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000468{
469 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000470
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000471 if (self->buf_size == 0) {
472 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000474 size = ((n < 32) ? 32 : n);
Tim Petersee1a53c2003-02-02 02:57:53 +0000475 if (!( self->buf = (char *)malloc(size))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000476 PyErr_NoMemory();
477 return -1;
478 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000479
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000480 self->buf_size = size;
481 }
482 else if (n > self->buf_size) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000483 self->buf = (char *)realloc(self->buf, n);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000484 if (!self->buf) {
485 PyErr_NoMemory();
486 return -1;
487 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000488 self->buf_size = n;
489 }
Tim Peters84e87f32001-03-17 04:50:51 +0000490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000491 Py_BEGIN_ALLOW_THREADS
492 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
493 Py_END_ALLOW_THREADS
494 if (nbytesread != (size_t)n) {
495 if (feof(self->fp)) {
496 PyErr_SetNone(PyExc_EOFError);
497 return -1;
498 }
Tim Peterscba30e22003-02-01 06:24:36 +0000499
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000500 PyErr_SetFromErrno(PyExc_IOError);
501 return -1;
502 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000503
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000504 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000506 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000507}
508
509
Tim Peters84e87f32001-03-17 04:50:51 +0000510static int
Tim Peterscba30e22003-02-01 06:24:36 +0000511readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000512{
513 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000515 if (self->buf_size == 0) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000516 if (!( self->buf = (char *)malloc(40))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000517 PyErr_NoMemory();
518 return -1;
519 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000520 self->buf_size = 40;
521 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000523 i = 0;
524 while (1) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000525 int bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000526 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000527 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000528 (self->buf[i] = getc(self->fp)) == '\n') {
529 self->buf[i + 1] = '\0';
530 *s = self->buf;
531 return i + 1;
532 }
533 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000534 bigger = self->buf_size << 1;
535 if (bigger <= 0) { /* overflow */
536 PyErr_NoMemory();
537 return -1;
538 }
539 self->buf = (char *)realloc(self->buf, bigger);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000540 if (!self->buf) {
541 PyErr_NoMemory();
542 return -1;
543 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000544 self->buf_size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000545 }
Tim Peters84e87f32001-03-17 04:50:51 +0000546}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000547
548
Tim Peters84e87f32001-03-17 04:50:51 +0000549static int
Tim Peterscba30e22003-02-01 06:24:36 +0000550read_cStringIO(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000551{
552 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000554 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
555 PyErr_SetNone(PyExc_EOFError);
556 return -1;
557 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000558
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000559 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000561 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000562}
563
564
Tim Peters84e87f32001-03-17 04:50:51 +0000565static int
Tim Peterscba30e22003-02-01 06:24:36 +0000566readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000567{
568 int n;
569 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000571 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
572 return -1;
573 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000575 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000577 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000578}
579
580
Tim Peters84e87f32001-03-17 04:50:51 +0000581static int
Tim Peterscba30e22003-02-01 06:24:36 +0000582read_other(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000583{
584 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000585
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000586 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000588 ARG_TUP(self, bytes);
589 if (self->arg) {
590 str = PyObject_Call(self->read, self->arg, NULL);
591 FREE_ARG_TUP(self);
592 }
593 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000594
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000595 Py_XDECREF(self->last_string);
596 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000598 if (! (*s = PyString_AsString(str))) return -1;
599 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000600}
601
602
Tim Peters84e87f32001-03-17 04:50:51 +0000603static int
Tim Peterscba30e22003-02-01 06:24:36 +0000604readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000605{
606 PyObject *str;
607 int str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000609 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
610 return -1;
611 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000613 if ((str_size = PyString_Size(str)) < 0)
614 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000615
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000616 Py_XDECREF(self->last_string);
617 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000619 if (! (*s = PyString_AsString(str)))
620 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000622 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000623}
624
Tim Petersee1a53c2003-02-02 02:57:53 +0000625/* Copy the first n bytes from s into newly malloc'ed memory, plus a
626 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
627 * The caller is responsible for free()'ing the return value.
628 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000629static char *
Tim Petersee1a53c2003-02-02 02:57:53 +0000630pystrndup(char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000631{
Tim Petersee1a53c2003-02-02 02:57:53 +0000632 char *r = (char *)malloc(n+1);
633 if (r == NULL)
634 return (char*)PyErr_NoMemory();
635 memcpy(r, s, n);
636 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000637 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000638}
639
640
641static int
Tim Peterscba30e22003-02-01 06:24:36 +0000642get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000643{
644 PyObject *value, *mv;
645 long c_value;
646 char s[30];
647 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000648
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000649 if (!( mv = PyDict_GetItem(self->memo, id))) {
650 PyErr_SetObject(PyExc_KeyError, id);
651 return -1;
652 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000653
Tim Peterscba30e22003-02-01 06:24:36 +0000654 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000655 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000657 if (!( PyInt_Check(value))) {
658 PyErr_SetString(PicklingError, "no int where int expected in memo");
659 return -1;
660 }
661 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000662
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000663 if (!self->bin) {
664 s[0] = GET;
665 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
666 len = strlen(s);
667 }
668 else if (Pdata_Check(self->file)) {
669 if (write_other(self, NULL, 0) < 0) return -1;
670 PDATA_APPEND(self->file, mv, -1);
671 return 0;
672 }
673 else {
674 if (c_value < 256) {
675 s[0] = BINGET;
676 s[1] = (int)(c_value & 0xff);
677 len = 2;
678 }
679 else {
680 s[0] = LONG_BINGET;
681 s[1] = (int)(c_value & 0xff);
682 s[2] = (int)((c_value >> 8) & 0xff);
683 s[3] = (int)((c_value >> 16) & 0xff);
684 s[4] = (int)((c_value >> 24) & 0xff);
685 len = 5;
686 }
687 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000689 if ((*self->write_func)(self, s, len) < 0)
690 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000691
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000692 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000693}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000694
Guido van Rossum60456fd1997-04-09 17:36:32 +0000695
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000696static int
Tim Peterscba30e22003-02-01 06:24:36 +0000697put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000698{
Tim Peterscba30e22003-02-01 06:24:36 +0000699 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000700 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000702 return put2(self, ob);
703}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000704
Guido van Rossum053b8df1998-11-25 16:18:00 +0000705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000706static int
Tim Peterscba30e22003-02-01 06:24:36 +0000707put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000708{
709 char c_str[30];
710 int p;
711 size_t len;
712 int res = -1;
713 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000715 if (self->fast)
716 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000718 if ((p = PyDict_Size(self->memo)) < 0)
719 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000721 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000722 /* XXX Why?
723 * XXX And does "positive" really mean non-negative?
724 * XXX pickle.py starts with PUT index 0, not 1. This makes for
725 * XXX gratuitous differences between the pickling modules.
726 */
Tim Peterscba30e22003-02-01 06:24:36 +0000727 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000728
Tim Peterscba30e22003-02-01 06:24:36 +0000729 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000730 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000731
Tim Peterscba30e22003-02-01 06:24:36 +0000732 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000733 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000734
Tim Peterscba30e22003-02-01 06:24:36 +0000735 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000736 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000738 PyTuple_SET_ITEM(t, 0, memo_len);
739 Py_INCREF(memo_len);
740 PyTuple_SET_ITEM(t, 1, ob);
741 Py_INCREF(ob);
742
743 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
744 goto finally;
745
746 if (!self->bin) {
747 c_str[0] = PUT;
748 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
749 len = strlen(c_str);
750 }
751 else if (Pdata_Check(self->file)) {
752 if (write_other(self, NULL, 0) < 0) return -1;
753 PDATA_APPEND(self->file, memo_len, -1);
754 res=0; /* Job well done ;) */
755 goto finally;
756 }
757 else {
758 if (p >= 256) {
759 c_str[0] = LONG_BINPUT;
760 c_str[1] = (int)(p & 0xff);
761 c_str[2] = (int)((p >> 8) & 0xff);
762 c_str[3] = (int)((p >> 16) & 0xff);
763 c_str[4] = (int)((p >> 24) & 0xff);
764 len = 5;
765 }
766 else {
767 c_str[0] = BINPUT;
768 c_str[1] = p;
769 len = 2;
770 }
771 }
772
773 if ((*self->write_func)(self, c_str, len) < 0)
774 goto finally;
775
776 res = 0;
777
778 finally:
779 Py_XDECREF(py_ob_id);
780 Py_XDECREF(memo_len);
781 Py_XDECREF(t);
782
783 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000784}
785
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000786#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000787
788static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000789PyImport_Import(PyObject *module_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000790{
791 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
792 static PyObject *standard_builtins=0;
793 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000795 if (!( silly_list )) {
Tim Peterscba30e22003-02-01 06:24:36 +0000796 if (!( __import___str=PyString_FromString("__import__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000797 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000798 if (!( __builtins___str=PyString_FromString("__builtins__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000799 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000800 if (!( silly_list=Py_BuildValue("[s]","__doc__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000801 return NULL;
802 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000804 if ((globals=PyEval_GetGlobals())) {
805 Py_INCREF(globals);
806 __builtins__=PyObject_GetItem(globals,__builtins___str);
Tim Peterscba30e22003-02-01 06:24:36 +0000807 if (!__builtins__)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000808 goto err;
809 }
810 else {
811 PyErr_Clear();
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000813 if (!(standard_builtins ||
Tim Peterscba30e22003-02-01 06:24:36 +0000814 (standard_builtins=PyImport_ImportModule("__builtin__"))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000815 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000817 __builtins__=standard_builtins;
818 Py_INCREF(__builtins__);
819 globals = Py_BuildValue("{sO}", "__builtins__", __builtins__);
Tim Peterscba30e22003-02-01 06:24:36 +0000820 if (!globals)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000821 goto err;
822 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000824 if (PyDict_Check(__builtins__)) {
825 __import__=PyObject_GetItem(__builtins__,__import___str);
826 if (!__import__) goto err;
827 }
828 else {
829 __import__=PyObject_GetAttr(__builtins__,__import___str);
830 if (!__import__) goto err;
831 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000833 r=PyObject_CallFunction(__import__,"OOOO",
834 module_name, globals, globals, silly_list);
Tim Peterscba30e22003-02-01 06:24:36 +0000835 if (!r)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000836 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000837
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000838 Py_DECREF(globals);
839 Py_DECREF(__builtins__);
840 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000842 return r;
843 err:
844 Py_XDECREF(globals);
845 Py_XDECREF(__builtins__);
846 Py_XDECREF(__import__);
847 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000848}
849
850static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000851whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000852{
853 int i, j;
854 PyObject *module = 0, *modules_dict = 0,
855 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000857 module = PyObject_GetAttrString(global, "__module__");
858 if (module) return module;
859 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000860
Tim Peterscba30e22003-02-01 06:24:36 +0000861 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000862 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000864 i = 0;
865 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000867 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000869 global_name_attr = PyObject_GetAttr(module, global_name);
870 if (!global_name_attr) {
871 PyErr_Clear();
872 continue;
873 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000874
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000875 if (global_name_attr != global) {
876 Py_DECREF(global_name_attr);
877 continue;
878 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000880 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000882 break;
883 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000884
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000885 /* The following implements the rule in pickle.py added in 1.5
886 that used __main__ if no module is found. I don't actually
887 like this rule. jlf
888 */
889 if (!j) {
890 j=1;
891 name=__main___str;
892 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000894 Py_INCREF(name);
895 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000896}
897
898
Guido van Rossum60456fd1997-04-09 17:36:32 +0000899static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000900fast_save_enter(Picklerobject *self, PyObject *obj)
901{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000902 /* if fast_container < 0, we're doing an error exit. */
903 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
904 PyObject *key = NULL;
905 if (self->fast_memo == NULL) {
906 self->fast_memo = PyDict_New();
907 if (self->fast_memo == NULL) {
908 self->fast_container = -1;
909 return 0;
910 }
911 }
912 key = PyLong_FromVoidPtr(obj);
913 if (key == NULL)
914 return 0;
915 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000916 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000917 PyErr_Format(PyExc_ValueError,
918 "fast mode: can't pickle cyclic objects including object type %s at %p",
919 obj->ob_type->tp_name, obj);
920 self->fast_container = -1;
921 return 0;
922 }
923 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000924 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000925 self->fast_container = -1;
926 return 0;
927 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000928 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000929 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000930 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000931}
932
Tim Peterscba30e22003-02-01 06:24:36 +0000933int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000934fast_save_leave(Picklerobject *self, PyObject *obj)
935{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000936 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
937 PyObject *key = PyLong_FromVoidPtr(obj);
938 if (key == NULL)
939 return 0;
940 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000941 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000942 return 0;
943 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000944 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000945 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000946 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000947}
948
949static int
Tim Peterscba30e22003-02-01 06:24:36 +0000950save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000951{
952 static char none = NONE;
953 if ((*self->write_func)(self, &none, 1) < 0)
954 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000955
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000956 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000957}
958
Guido van Rossum77f6a652002-04-03 22:41:51 +0000959static int
Tim Peterscba30e22003-02-01 06:24:36 +0000960save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000961{
Guido van Rossume2763392002-04-05 19:30:08 +0000962 static char *buf[2] = {FALSE, TRUE};
963 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000964 long l = PyInt_AS_LONG((PyIntObject *)args);
965
Tim Peters3c67d792003-02-02 17:59:11 +0000966 if (self->proto >= 2) {
967 char opcode = l ? NEWTRUE : NEWFALSE;
968 if (self->write_func(self, &opcode, 1) < 0)
969 return -1;
970 }
971 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000972 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000973 return 0;
974}
Tim Peters84e87f32001-03-17 04:50:51 +0000975
Guido van Rossum60456fd1997-04-09 17:36:32 +0000976static int
Tim Peterscba30e22003-02-01 06:24:36 +0000977save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000978{
979 char c_str[32];
980 long l = PyInt_AS_LONG((PyIntObject *)args);
981 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000983 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000984#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000985 || l > 0x7fffffffL
986 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000987#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000988 ) {
989 /* Text-mode pickle, or long too big to fit in the 4-byte
990 * signed BININT format: store as a string.
991 */
992 c_str[0] = INT;
993 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
994 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
995 return -1;
996 }
997 else {
998 /* Binary pickle and l fits in a signed 4-byte int. */
999 c_str[1] = (int)( l & 0xff);
1000 c_str[2] = (int)((l >> 8) & 0xff);
1001 c_str[3] = (int)((l >> 16) & 0xff);
1002 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001004 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1005 if (c_str[2] == 0) {
1006 c_str[0] = BININT1;
1007 len = 2;
1008 }
1009 else {
1010 c_str[0] = BININT2;
1011 len = 3;
1012 }
1013 }
1014 else {
1015 c_str[0] = BININT;
1016 len = 5;
1017 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001018
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001019 if ((*self->write_func)(self, c_str, len) < 0)
1020 return -1;
1021 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001023 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001024}
1025
1026
1027static int
Tim Peterscba30e22003-02-01 06:24:36 +00001028save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001029{
Tim Petersee1a53c2003-02-02 02:57:53 +00001030 int size;
1031 int res = -1;
1032 PyObject *repr = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001034 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001035
Tim Petersee1a53c2003-02-02 02:57:53 +00001036 if (self->proto >= 2) {
1037 /* Linear-time pickling. */
1038 size_t nbits;
1039 size_t nbytes;
1040 unsigned char *pdata;
1041 char c_str[5];
1042 int i;
1043 int sign = _PyLong_Sign(args);
1044
1045 if (sign == 0) {
1046 /* It's 0 -- an empty bytestring. */
1047 c_str[0] = LONG1;
1048 c_str[1] = 0;
1049 i = self->write_func(self, c_str, 2);
1050 if (i < 0) goto finally;
1051 res = 0;
1052 goto finally;
1053 }
1054 nbits = _PyLong_NumBits(args);
1055 if (nbits == (size_t)-1 && PyErr_Occurred())
1056 goto finally;
1057 /* How many bytes do we need? There are nbits >> 3 full
1058 * bytes of data, and nbits & 7 leftover bits. If there
1059 * are any leftover bits, then we clearly need another
1060 * byte. Wnat's not so obvious is that we *probably*
1061 * need another byte even if there aren't any leftovers:
1062 * the most-significant bit of the most-significant byte
1063 * acts like a sign bit, and it's usually got a sense
1064 * opposite of the one we need. The exception is longs
1065 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1066 * its own 256's-complement, so has the right sign bit
1067 * even without the extra byte. That's a pain to check
1068 * for in advance, though, so we always grab an extra
1069 * byte at the start, and cut it back later if possible.
1070 */
1071 nbytes = (nbits >> 3) + 1;
1072 if ((int)nbytes < 0 || (size_t)(int)nbytes != nbytes) {
1073 PyErr_SetString(PyExc_OverflowError, "long too large "
1074 "to pickle");
1075 goto finally;
1076 }
1077 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
1078 if (repr == NULL) goto finally;
1079 pdata = (unsigned char *)PyString_AS_STRING(repr);
1080 i = _PyLong_AsByteArray((PyLongObject *)args,
1081 pdata, nbytes,
1082 1 /* little endian */, 1 /* signed */);
1083 if (i < 0) goto finally;
1084 /* If the long is negative, this may be a byte more than
1085 * needed. This is so iff the MSB is all redundant sign
1086 * bits.
1087 */
1088 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1089 (pdata[nbytes - 2] & 0x80) != 0)
1090 --nbytes;
1091
1092 if (nbytes < 256) {
1093 c_str[0] = LONG1;
1094 c_str[1] = (char)nbytes;
1095 size = 2;
1096 }
1097 else {
1098 c_str[0] = LONG4;
1099 size = (int)nbytes;
1100 for (i = 1; i < 5; i++) {
1101 c_str[i] = (char)(size & 0xff);
1102 size >>= 8;
1103 }
1104 size = 5;
1105 }
1106 i = self->write_func(self, c_str, size);
1107 if (i < 0) goto finally;
1108 i = self->write_func(self, (char *)pdata, (int)nbytes);
1109 if (i < 0) goto finally;
1110 res = 0;
1111 goto finally;
1112 }
1113
1114 /* proto < 2: write the repr and newline. This is quadratic-time
1115 * (in the number of digits), in both directions.
1116 */
Tim Peterscba30e22003-02-01 06:24:36 +00001117 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001118 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001120 if ((size = PyString_Size(repr)) < 0)
1121 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001123 if ((*self->write_func)(self, &l, 1) < 0)
1124 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001125
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001126 if ((*self->write_func)(self,
Tim Peterscba30e22003-02-01 06:24:36 +00001127 PyString_AS_STRING((PyStringObject *)repr),
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001128 size) < 0)
1129 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001131 if ((*self->write_func)(self, "\n", 1) < 0)
1132 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001133
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001134 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001136 finally:
1137 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001138 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001139}
1140
1141
1142static int
Tim Peterscba30e22003-02-01 06:24:36 +00001143save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001144{
1145 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001147 if (self->bin) {
1148 int s, e;
1149 double f;
1150 long fhi, flo;
1151 char str[9];
1152 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001153
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001154 *p = BINFLOAT;
1155 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001157 if (x < 0) {
1158 s = 1;
1159 x = -x;
1160 }
1161 else
1162 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001164 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001166 /* Normalize f to be in the range [1.0, 2.0) */
1167 if (0.5 <= f && f < 1.0) {
1168 f *= 2.0;
1169 e--;
1170 }
1171 else if (f == 0.0) {
1172 e = 0;
1173 }
1174 else {
1175 PyErr_SetString(PyExc_SystemError,
1176 "frexp() result out of range");
1177 return -1;
1178 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001180 if (e >= 1024) {
1181 /* XXX 1024 itself is reserved for Inf/NaN */
1182 PyErr_SetString(PyExc_OverflowError,
1183 "float too large to pack with d format");
1184 return -1;
1185 }
1186 else if (e < -1022) {
1187 /* Gradual underflow */
1188 f = ldexp(f, 1022 + e);
1189 e = 0;
1190 }
1191 else if (!(e == 0 && f == 0.0)) {
1192 e += 1023;
1193 f -= 1.0; /* Get rid of leading 1 */
1194 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001195
Tim Peterscba30e22003-02-01 06:24:36 +00001196 /* fhi receives the high 28 bits;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001197 flo the low 24 bits (== 52 bits) */
1198 f *= 268435456.0; /* 2**28 */
1199 fhi = (long) floor(f); /* Truncate */
1200 f -= (double)fhi;
1201 f *= 16777216.0; /* 2**24 */
1202 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001204 /* First byte */
1205 *p = (s<<7) | (e>>4);
1206 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001208 /* Second byte */
1209 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1210 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001212 /* Third byte */
1213 *p = (unsigned char) ((fhi>>16) & 0xFF);
1214 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001216 /* Fourth byte */
1217 *p = (unsigned char) ((fhi>>8) & 0xFF);
1218 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001220 /* Fifth byte */
1221 *p = (unsigned char) (fhi & 0xFF);
1222 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001223
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001224 /* Sixth byte */
1225 *p = (unsigned char) ((flo>>16) & 0xFF);
1226 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001227
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001228 /* Seventh byte */
1229 *p = (unsigned char) ((flo>>8) & 0xFF);
1230 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001232 /* Eighth byte */
1233 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001235 if ((*self->write_func)(self, str, 9) < 0)
1236 return -1;
1237 }
1238 else {
1239 char c_str[250];
1240 c_str[0] = FLOAT;
1241 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001243 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1244 return -1;
1245 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001247 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001248}
1249
1250
1251static int
Tim Peterscba30e22003-02-01 06:24:36 +00001252save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001253{
1254 int size, len;
1255 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001256
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001257 if ((size = PyString_Size(args)) < 0)
1258 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001259
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001260 if (!self->bin) {
1261 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001263 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001264
Tim Peterscba30e22003-02-01 06:24:36 +00001265 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001266 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001268 if ((len = PyString_Size(repr)) < 0)
1269 goto err;
1270 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001272 if ((*self->write_func)(self, &string, 1) < 0)
1273 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001275 if ((*self->write_func)(self, repr_str, len) < 0)
1276 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001278 if ((*self->write_func)(self, "\n", 1) < 0)
1279 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001281 Py_XDECREF(repr);
1282 }
1283 else {
1284 int i;
1285 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001286
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001287 if ((size = PyString_Size(args)) < 0)
1288 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001289
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001290 if (size < 256) {
1291 c_str[0] = SHORT_BINSTRING;
1292 c_str[1] = size;
1293 len = 2;
1294 }
1295 else {
1296 c_str[0] = BINSTRING;
1297 for (i = 1; i < 5; i++)
1298 c_str[i] = (int)(size >> ((i - 1) * 8));
1299 len = 5;
1300 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001302 if ((*self->write_func)(self, c_str, len) < 0)
1303 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001304
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001305 if (size > 128 && Pdata_Check(self->file)) {
1306 if (write_other(self, NULL, 0) < 0) return -1;
1307 PDATA_APPEND(self->file, args, -1);
1308 }
1309 else {
1310 if ((*self->write_func)(self,
1311 PyString_AS_STRING((PyStringObject *)args), size) < 0)
1312 return -1;
1313 }
1314 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001315
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001316 if (doput)
1317 if (put(self, args) < 0)
1318 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001319
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001320 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001322 err:
1323 Py_XDECREF(repr);
1324 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001325}
1326
1327
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001328#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001329/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1330 backslash and newline characters to \uXXXX escapes. */
1331static PyObject *
1332modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1333{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001334 PyObject *repr;
1335 char *p;
1336 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001338 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001339
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001340 repr = PyString_FromStringAndSize(NULL, 6 * size);
1341 if (repr == NULL)
1342 return NULL;
1343 if (size == 0)
1344 return repr;
1345
1346 p = q = PyString_AS_STRING(repr);
1347 while (size-- > 0) {
1348 Py_UNICODE ch = *s++;
1349 /* Map 16-bit characters to '\uxxxx' */
1350 if (ch >= 256 || ch == '\\' || ch == '\n') {
1351 *p++ = '\\';
1352 *p++ = 'u';
1353 *p++ = hexdigit[(ch >> 12) & 0xf];
1354 *p++ = hexdigit[(ch >> 8) & 0xf];
1355 *p++ = hexdigit[(ch >> 4) & 0xf];
1356 *p++ = hexdigit[ch & 15];
1357 }
1358 /* Copy everything else as-is */
1359 else
1360 *p++ = (char) ch;
1361 }
1362 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001363 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001364 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001365}
1366
1367
Guido van Rossum60456fd1997-04-09 17:36:32 +00001368static int
Tim Peterscba30e22003-02-01 06:24:36 +00001369save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001370{
1371 int size, len;
1372 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001373
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001374 if (!PyUnicode_Check(args))
1375 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001377 if (!self->bin) {
1378 char *repr_str;
1379 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001381 repr = modified_EncodeRawUnicodeEscape(
1382 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001383 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001384 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001386 if ((len = PyString_Size(repr)) < 0)
1387 goto err;
1388 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001389
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001390 if ((*self->write_func)(self, &string, 1) < 0)
1391 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001393 if ((*self->write_func)(self, repr_str, len) < 0)
1394 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001396 if ((*self->write_func)(self, "\n", 1) < 0)
1397 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001399 Py_XDECREF(repr);
1400 }
1401 else {
1402 int i;
1403 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001404
Tim Peterscba30e22003-02-01 06:24:36 +00001405 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001406 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001408 if ((size = PyString_Size(repr)) < 0)
1409 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001411 c_str[0] = BINUNICODE;
1412 for (i = 1; i < 5; i++)
1413 c_str[i] = (int)(size >> ((i - 1) * 8));
1414 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001415
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001416 if ((*self->write_func)(self, c_str, len) < 0)
1417 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001419 if (size > 128 && Pdata_Check(self->file)) {
1420 if (write_other(self, NULL, 0) < 0)
1421 goto err;
1422 PDATA_APPEND(self->file, repr, -1);
1423 }
1424 else {
1425 if ((*self->write_func)(self, PyString_AS_STRING(repr),
1426 size) < 0)
1427 goto err;
1428 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001429
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001430 Py_DECREF(repr);
1431 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001433 if (doput)
1434 if (put(self, args) < 0)
1435 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001437 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001439 err:
1440 Py_XDECREF(repr);
1441 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001442}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001443#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001444
1445
1446static int
Tim Peterscba30e22003-02-01 06:24:36 +00001447save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001448{
1449 PyObject *element = 0, *py_tuple_id = 0;
1450 int len, i, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001452 static char tuple = TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001453
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001454 if ((*self->write_func)(self, &MARKv, 1) < 0)
1455 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001456
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001457 if ((len = PyTuple_Size(args)) < 0)
1458 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001460 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001461 if (!( element = PyTuple_GET_ITEM((PyTupleObject *)args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001462 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001464 if (save(self, element, 0) < 0)
1465 goto finally;
1466 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001467
Tim Peterscba30e22003-02-01 06:24:36 +00001468 if (!( py_tuple_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001469 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001470
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001471 if (len) {
1472 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1473 if (self->bin) {
1474 static char pop_mark = POP_MARK;
Tim Peters84e87f32001-03-17 04:50:51 +00001475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001476 if ((*self->write_func)(self, &pop_mark, 1) < 0)
1477 goto finally;
1478 }
1479 else {
1480 static char pop = POP;
Tim Peters84e87f32001-03-17 04:50:51 +00001481
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001482 for (i = 0; i <= len; i++) {
1483 if ((*self->write_func)(self, &pop, 1) < 0)
1484 goto finally;
1485 }
1486 }
Tim Peters84e87f32001-03-17 04:50:51 +00001487
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001488 if (get(self, py_tuple_id) < 0)
1489 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001491 res = 0;
1492 goto finally;
1493 }
1494 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001496 if ((*self->write_func)(self, &tuple, 1) < 0) {
1497 goto finally;
1498 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001499
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001500 if (put(self, args) < 0)
1501 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001502
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001503 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001505 finally:
1506 Py_XDECREF(py_tuple_id);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001508 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001509}
1510
1511static int
Tim Peterscba30e22003-02-01 06:24:36 +00001512save_empty_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001513{
1514 static char tuple = EMPTY_TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001516 return (*self->write_func)(self, &tuple, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001517}
1518
1519
1520static int
Tim Peterscba30e22003-02-01 06:24:36 +00001521save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001522{
1523 PyObject *element = 0;
1524 int s_len, len, i, using_appends, res = -1;
1525 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001527 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001528
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001529 if (self->fast && !fast_save_enter(self, args))
1530 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001531
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001532 if (self->bin) {
1533 s[0] = EMPTY_LIST;
1534 s_len = 1;
1535 }
1536 else {
1537 s[0] = MARK;
1538 s[1] = LIST;
1539 s_len = 2;
1540 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001542 if ((len = PyList_Size(args)) < 0)
1543 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001545 if ((*self->write_func)(self, s, s_len) < 0)
1546 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001548 if (len == 0) {
1549 if (put(self, args) < 0)
1550 goto finally;
1551 }
1552 else {
1553 if (put2(self, args) < 0)
1554 goto finally;
1555 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001557 if ((using_appends = (self->bin && (len > 1))))
1558 if ((*self->write_func)(self, &MARKv, 1) < 0)
1559 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001561 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001562 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001563 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001564
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001565 if (save(self, element, 0) < 0)
1566 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001567
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001568 if (!using_appends) {
1569 if ((*self->write_func)(self, &append, 1) < 0)
1570 goto finally;
1571 }
1572 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001573
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001574 if (using_appends) {
1575 if ((*self->write_func)(self, &appends, 1) < 0)
1576 goto finally;
1577 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001579 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001581 finally:
1582 if (self->fast && !fast_save_leave(self, args))
1583 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001585 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001586}
1587
1588
Guido van Rossum60456fd1997-04-09 17:36:32 +00001589static int
Tim Peterscba30e22003-02-01 06:24:36 +00001590save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001591{
1592 PyObject *key = 0, *value = 0;
1593 int i, len, res = -1, using_setitems;
1594 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001596 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001598 if (self->fast && !fast_save_enter(self, args))
1599 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001600
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001601 if (self->bin) {
1602 s[0] = EMPTY_DICT;
1603 len = 1;
1604 }
1605 else {
1606 s[0] = MARK;
1607 s[1] = DICT;
1608 len = 2;
1609 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001611 if ((*self->write_func)(self, s, len) < 0)
1612 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001614 if ((len = PyDict_Size(args)) < 0)
1615 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001617 if (len == 0) {
1618 if (put(self, args) < 0)
1619 goto finally;
1620 }
1621 else {
1622 if (put2(self, args) < 0)
1623 goto finally;
1624 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001625
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001626 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
1627 if ((*self->write_func)(self, &MARKv, 1) < 0)
1628 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001630 i = 0;
1631 while (PyDict_Next(args, &i, &key, &value)) {
1632 if (save(self, key, 0) < 0)
1633 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001634
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001635 if (save(self, value, 0) < 0)
1636 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001637
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001638 if (!using_setitems) {
1639 if ((*self->write_func)(self, &setitem, 1) < 0)
1640 goto finally;
1641 }
1642 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001644 if (using_setitems) {
1645 if ((*self->write_func)(self, &setitems, 1) < 0)
1646 goto finally;
1647 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001648
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001649 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001651 finally:
1652 if (self->fast && !fast_save_leave(self, args))
1653 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001654
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001655 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001656}
1657
1658
Tim Peters84e87f32001-03-17 04:50:51 +00001659static int
Tim Peterscba30e22003-02-01 06:24:36 +00001660save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001661{
1662 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1663 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1664 char *module_str, *name_str;
1665 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001666
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001667 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001669 if (self->fast && !fast_save_enter(self, args))
1670 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001672 if ((*self->write_func)(self, &MARKv, 1) < 0)
1673 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001674
Tim Peterscba30e22003-02-01 06:24:36 +00001675 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001676 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001677
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001678 if (self->bin) {
1679 if (save(self, class, 0) < 0)
1680 goto finally;
1681 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001683 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1684 PyObject *element = 0;
1685 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001687 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00001688 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001689 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001691 if ((len = PyObject_Size(class_args)) < 0)
1692 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001694 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001695 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001696 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001698 if (save(self, element, 0) < 0) {
1699 Py_DECREF(element);
1700 goto finally;
1701 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001703 Py_DECREF(element);
1704 }
1705 }
1706 else {
1707 PyErr_Clear();
1708 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001710 if (!self->bin) {
1711 if (!( name = ((PyClassObject *)class)->cl_name )) {
1712 PyErr_SetString(PicklingError, "class has no name");
1713 goto finally;
1714 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001715
Tim Peterscba30e22003-02-01 06:24:36 +00001716 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001717 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001718
Tim Peters84e87f32001-03-17 04:50:51 +00001719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001720 if ((module_size = PyString_Size(module)) < 0 ||
1721 (name_size = PyString_Size(name)) < 0)
1722 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001724 module_str = PyString_AS_STRING((PyStringObject *)module);
1725 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001727 if ((*self->write_func)(self, &inst, 1) < 0)
1728 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001730 if ((*self->write_func)(self, module_str, module_size) < 0)
1731 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001732
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001733 if ((*self->write_func)(self, "\n", 1) < 0)
1734 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001736 if ((*self->write_func)(self, name_str, name_size) < 0)
1737 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001738
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001739 if ((*self->write_func)(self, "\n", 1) < 0)
1740 goto finally;
1741 }
1742 else if ((*self->write_func)(self, &obj, 1) < 0) {
1743 goto finally;
1744 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001746 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1747 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00001748 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001749 goto finally;
1750 }
1751 else {
1752 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001754 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1755 PyErr_Clear();
1756 res = 0;
1757 goto finally;
1758 }
1759 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001760
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001761 if (!PyDict_Check(state)) {
1762 if (put2(self, args) < 0)
1763 goto finally;
1764 }
1765 else {
1766 if (put(self, args) < 0)
1767 goto finally;
1768 }
Tim Peters84e87f32001-03-17 04:50:51 +00001769
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001770 if (save(self, state, 0) < 0)
1771 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001773 if ((*self->write_func)(self, &build, 1) < 0)
1774 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001776 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001778 finally:
1779 if (self->fast && !fast_save_leave(self, args))
1780 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001782 Py_XDECREF(module);
1783 Py_XDECREF(class);
1784 Py_XDECREF(state);
1785 Py_XDECREF(getinitargs_func);
1786 Py_XDECREF(getstate_func);
1787 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001789 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001790}
1791
1792
Guido van Rossum60456fd1997-04-09 17:36:32 +00001793static int
Tim Peterscba30e22003-02-01 06:24:36 +00001794save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001795{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001796 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001797 char *name_str, *module_str;
1798 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001799
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001800 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001802 if (name) {
1803 global_name = name;
1804 Py_INCREF(global_name);
1805 }
1806 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001807 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001808 goto finally;
1809 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001810
Tim Peterscba30e22003-02-01 06:24:36 +00001811 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001812 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001814 if ((module_size = PyString_Size(module)) < 0 ||
1815 (name_size = PyString_Size(global_name)) < 0)
1816 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001818 module_str = PyString_AS_STRING((PyStringObject *)module);
1819 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001820
Guido van Rossum75bfd052002-12-24 18:10:07 +00001821 /* XXX This can be doing a relative import. Clearly it shouldn't,
1822 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001823 mod = PyImport_ImportModule(module_str);
1824 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001825 cPickle_ErrFormat(PicklingError,
1826 "Can't pickle %s: it's not found as %s.%s",
1827 "OSS", args, module, global_name);
1828 goto finally;
1829 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001830 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001831 if (klass == NULL) {
1832 cPickle_ErrFormat(PicklingError,
1833 "Can't pickle %s: it's not found as %s.%s",
1834 "OSS", args, module, global_name);
1835 goto finally;
1836 }
1837 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001838 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001839 cPickle_ErrFormat(PicklingError,
1840 "Can't pickle %s: it's not the same object as %s.%s",
1841 "OSS", args, module, global_name);
1842 goto finally;
1843 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001844 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001846 if ((*self->write_func)(self, &global, 1) < 0)
1847 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001849 if ((*self->write_func)(self, module_str, module_size) < 0)
1850 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001852 if ((*self->write_func)(self, "\n", 1) < 0)
1853 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001854
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001855 if ((*self->write_func)(self, name_str, name_size) < 0)
1856 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001858 if ((*self->write_func)(self, "\n", 1) < 0)
1859 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001861 if (put(self, args) < 0)
1862 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001864 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001866 finally:
1867 Py_XDECREF(module);
1868 Py_XDECREF(global_name);
1869 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001870
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001871 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001872}
1873
Guido van Rossum60456fd1997-04-09 17:36:32 +00001874static int
Tim Peterscba30e22003-02-01 06:24:36 +00001875save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001876{
1877 PyObject *pid = 0;
1878 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001880 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001882 Py_INCREF(args);
1883 ARG_TUP(self, args);
1884 if (self->arg) {
1885 pid = PyObject_Call(f, self->arg, NULL);
1886 FREE_ARG_TUP(self);
1887 }
1888 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001890 if (pid != Py_None) {
1891 if (!self->bin) {
1892 if (!PyString_Check(pid)) {
1893 PyErr_SetString(PicklingError,
1894 "persistent id must be string");
1895 goto finally;
1896 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001898 if ((*self->write_func)(self, &persid, 1) < 0)
1899 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001901 if ((size = PyString_Size(pid)) < 0)
1902 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001903
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001904 if ((*self->write_func)(self,
1905 PyString_AS_STRING((PyStringObject *)pid), size) < 0)
1906 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001907
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001908 if ((*self->write_func)(self, "\n", 1) < 0)
1909 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001910
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001911 res = 1;
1912 goto finally;
1913 }
1914 else if (save(self, pid, 1) >= 0) {
1915 if ((*self->write_func)(self, &binpersid, 1) < 0)
1916 res = -1;
1917 else
1918 res = 1;
1919 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001921 goto finally;
1922 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001924 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001926 finally:
1927 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001928
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001929 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001930}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001931
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001932
Tim Peters84e87f32001-03-17 04:50:51 +00001933static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001934save_reduce(Picklerobject *self, PyObject *callable,
Tim Peterscba30e22003-02-01 06:24:36 +00001935 PyObject *tup, PyObject *state, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001936{
1937 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001939 if (save(self, callable, 0) < 0)
1940 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001942 if (save(self, tup, 0) < 0)
1943 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001945 if ((*self->write_func)(self, &reduce, 1) < 0)
1946 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001948 if (ob != NULL) {
1949 if (state && !PyDict_Check(state)) {
1950 if (put2(self, ob) < 0)
1951 return -1;
1952 }
1953 else {
1954 if (put(self, ob) < 0)
1955 return -1;
1956 }
1957 }
Tim Peters84e87f32001-03-17 04:50:51 +00001958
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001959 if (state) {
1960 if (save(self, state, 0) < 0)
1961 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001963 if ((*self->write_func)(self, &build, 1) < 0)
1964 return -1;
1965 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001967 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001968}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001969
Guido van Rossum60456fd1997-04-09 17:36:32 +00001970static int
Tim Peterscba30e22003-02-01 06:24:36 +00001971save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001972{
1973 PyTypeObject *type;
1974 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
1975 *callable = 0, *state = 0;
1976 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001977
Martin v. Löwis5a395302002-08-04 08:20:23 +00001978 if (self->nesting++ > Py_GetRecursionLimit()){
1979 PyErr_SetString(PyExc_RuntimeError,
1980 "maximum recursion depth exceeded");
1981 goto finally;
1982 }
1983
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001984 if (!pers_save && self->pers_func) {
1985 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1986 res = tmp;
1987 goto finally;
1988 }
1989 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001990
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001991 if (args == Py_None) {
1992 res = save_none(self, args);
1993 goto finally;
1994 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001995
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001996 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001997
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001998 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00001999 case 'b':
2000 if (args == Py_False || args == Py_True) {
2001 res = save_bool(self, args);
2002 goto finally;
2003 }
2004 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002005 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002006 if (type == &PyInt_Type) {
2007 res = save_int(self, args);
2008 goto finally;
2009 }
2010 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002011
Guido van Rossum60456fd1997-04-09 17:36:32 +00002012 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002013 if (type == &PyLong_Type) {
2014 res = save_long(self, args);
2015 goto finally;
2016 }
2017 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002018
Guido van Rossum60456fd1997-04-09 17:36:32 +00002019 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002020 if (type == &PyFloat_Type) {
2021 res = save_float(self, args);
2022 goto finally;
2023 }
2024 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002025
Guido van Rossum60456fd1997-04-09 17:36:32 +00002026 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002027 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
2028 if (self->bin) res = save_empty_tuple(self, args);
2029 else res = save_tuple(self, args);
2030 goto finally;
2031 }
2032 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002033
Guido van Rossum60456fd1997-04-09 17:36:32 +00002034 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002035 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2036 res = save_string(self, args, 0);
2037 goto finally;
2038 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002039
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002040#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002041 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002042 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2043 res = save_unicode(self, args, 0);
2044 goto finally;
2045 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002046#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002047 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002048
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002049 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002050 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002051 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002052
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002053 if (PyDict_GetItem(self->memo, py_ob_id)) {
2054 if (get(self, py_ob_id) < 0)
2055 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002057 res = 0;
2058 goto finally;
2059 }
2060 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002061
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002062 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002063 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002064 if (type == &PyString_Type) {
2065 res = save_string(self, args, 1);
2066 goto finally;
2067 }
2068 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002069
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002070#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002071 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002072 if (type == &PyUnicode_Type) {
2073 res = save_unicode(self, args, 1);
2074 goto finally;
2075 }
2076 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002077#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002078
Guido van Rossum60456fd1997-04-09 17:36:32 +00002079 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002080 if (type == &PyTuple_Type) {
2081 res = save_tuple(self, args);
2082 goto finally;
2083 }
2084 if (type == &PyType_Type) {
2085 res = save_global(self, args, NULL);
2086 goto finally;
2087 }
2088 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002089
Guido van Rossum60456fd1997-04-09 17:36:32 +00002090 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002091 if (type == &PyList_Type) {
2092 res = save_list(self, args);
2093 goto finally;
2094 }
2095 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002096
2097 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002098 if (type == &PyDict_Type) {
2099 res = save_dict(self, args);
2100 goto finally;
2101 }
2102 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002103
2104 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002105 if (type == &PyInstance_Type) {
2106 res = save_inst(self, args);
2107 goto finally;
2108 }
2109 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002110
2111 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002112 if (type == &PyClass_Type) {
2113 res = save_global(self, args, NULL);
2114 goto finally;
2115 }
2116 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002117
2118 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002119 if (type == &PyFunction_Type) {
2120 res = save_global(self, args, NULL);
2121 goto finally;
2122 }
2123 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002124
2125 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002126 if (type == &PyCFunction_Type) {
2127 res = save_global(self, args, NULL);
2128 goto finally;
2129 }
2130 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002132 if (!pers_save && self->inst_pers_func) {
2133 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2134 res = tmp;
2135 goto finally;
2136 }
2137 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002138
Jeremy Hylton39c61162002-07-16 19:47:43 +00002139 if (PyType_IsSubtype(type, &PyType_Type)) {
2140 res = save_global(self, args, NULL);
2141 goto finally;
2142 }
2143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002144 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2145 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002147 Py_INCREF(args);
2148 ARG_TUP(self, args);
2149 if (self->arg) {
2150 t = PyObject_Call(__reduce__, self->arg, NULL);
2151 FREE_ARG_TUP(self);
2152 }
2153 if (! t) goto finally;
2154 }
2155 else {
2156 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002158 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2159 t = PyObject_Call(__reduce__, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00002160 if (!t)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002161 goto finally;
2162 }
2163 else {
2164 PyErr_Clear();
2165 }
2166 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002168 if (t) {
2169 if (PyString_Check(t)) {
2170 res = save_global(self, args, t);
2171 goto finally;
2172 }
Tim Peters84e87f32001-03-17 04:50:51 +00002173
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002174 if (!PyTuple_Check(t)) {
2175 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2176 "be a tuple", "O", __reduce__);
2177 goto finally;
2178 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002180 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002182 if ((size != 3) && (size != 2)) {
2183 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2184 "contain only two or three elements", "O", __reduce__);
2185 goto finally;
2186 }
Tim Peters84e87f32001-03-17 04:50:51 +00002187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002188 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002190 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002192 if (size > 2) {
2193 state = PyTuple_GET_ITEM(t, 2);
Guido van Rossum8e0ad0c2003-01-31 21:10:31 +00002194 if (state == Py_None)
2195 state = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002196 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002197
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002198 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2199 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2200 "returned by %s must be a tuple", "O", __reduce__);
2201 goto finally;
2202 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002204 res = save_reduce(self, callable, arg_tup, state, args);
2205 goto finally;
2206 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002208 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002209
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002210 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002211 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002212 Py_XDECREF(py_ob_id);
2213 Py_XDECREF(__reduce__);
2214 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002216 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002217}
2218
2219
2220static int
Tim Peterscba30e22003-02-01 06:24:36 +00002221dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002222{
2223 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002224
Tim Peters4190fb82003-02-02 16:09:05 +00002225 if (self->proto >= 2) {
2226 char bytes[2];
2227
2228 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002229 assert(self->proto >= 0 && self->proto < 256);
2230 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002231 if (self->write_func(self, bytes, 2) < 0)
2232 return -1;
2233 }
2234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002235 if (save(self, args, 0) < 0)
2236 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002237
Tim Peters4190fb82003-02-02 16:09:05 +00002238 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002239 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002240
Tim Peters4190fb82003-02-02 16:09:05 +00002241 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002242 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002243
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002244 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002245}
2246
2247static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002248Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002249{
Tim Peterscba30e22003-02-01 06:24:36 +00002250 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002251 PyDict_Clear(self->memo);
2252 Py_INCREF(Py_None);
2253 return Py_None;
2254}
2255
2256static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002257Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002258{
2259 int l, i, rsize, ssize, clear=1, lm;
2260 long ik;
2261 PyObject *k, *r;
2262 char *s, *p, *have_get;
2263 Pdata *data;
2264
2265 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002266 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002267 return NULL;
2268
2269 /* Check to make sure we are based on a list */
2270 if (! Pdata_Check(self->file)) {
2271 PyErr_SetString(PicklingError,
2272 "Attempt to getvalue() a non-list-based pickler");
2273 return NULL;
2274 }
2275
2276 /* flush write buffer */
2277 if (write_other(self, NULL, 0) < 0) return NULL;
2278
2279 data=(Pdata*)self->file;
2280 l=data->length;
2281
2282 /* set up an array to hold get/put status */
2283 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2284 lm++;
2285 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
2286 memset(have_get,0,lm);
2287
2288 /* Scan for gets. */
2289 for (rsize=0, i=l; --i >= 0; ) {
2290 k=data->data[i];
2291
2292 if (PyString_Check(k)) {
2293 rsize += PyString_GET_SIZE(k);
2294 }
2295
2296 else if (PyInt_Check(k)) { /* put */
2297 ik=PyInt_AS_LONG((PyIntObject*)k);
2298 if (ik >= lm || ik==0) {
2299 PyErr_SetString(PicklingError,
2300 "Invalid get data");
2301 return NULL;
2302 }
2303 if (have_get[ik]) { /* with matching get */
2304 if (ik < 256) rsize += 2;
2305 else rsize+=5;
2306 }
2307 }
2308
2309 else if (! (PyTuple_Check(k) &&
2310 PyTuple_GET_SIZE(k) == 2 &&
2311 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2312 ) {
2313 PyErr_SetString(PicklingError,
2314 "Unexpected data in internal list");
2315 return NULL;
2316 }
2317
2318 else { /* put */
2319 ik=PyInt_AS_LONG((PyIntObject*)k);
2320 if (ik >= lm || ik==0) {
2321 PyErr_SetString(PicklingError,
2322 "Invalid get data");
2323 return NULL;
2324 }
2325 have_get[ik]=1;
2326 if (ik < 256) rsize += 2;
2327 else rsize+=5;
2328 }
2329
2330 }
2331
2332 /* Now generate the result */
2333 if (!( r=PyString_FromStringAndSize(NULL,rsize))) goto err;
2334 s=PyString_AS_STRING((PyStringObject*)r);
2335
2336 for (i=0; i<l; i++) {
2337 k=data->data[i];
2338
2339 if (PyString_Check(k)) {
2340 ssize=PyString_GET_SIZE(k);
2341 if (ssize) {
2342 p=PyString_AS_STRING((PyStringObject*)k);
2343 while (--ssize >= 0) *s++=*p++;
2344 }
2345 }
2346
2347 else if (PyTuple_Check(k)) { /* get */
2348 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2349 if (ik < 256) {
2350 *s++ = BINGET;
2351 *s++ = (int)(ik & 0xff);
2352 }
2353 else {
2354 *s++ = LONG_BINGET;
2355 *s++ = (int)(ik & 0xff);
2356 *s++ = (int)((ik >> 8) & 0xff);
2357 *s++ = (int)((ik >> 16) & 0xff);
2358 *s++ = (int)((ik >> 24) & 0xff);
2359 }
2360 }
2361
2362 else { /* put */
2363 ik=PyInt_AS_LONG((PyIntObject*)k);
2364
2365 if (have_get[ik]) { /* with matching get */
2366 if (ik < 256) {
2367 *s++ = BINPUT;
2368 *s++ = (int)(ik & 0xff);
2369 }
2370 else {
2371 *s++ = LONG_BINPUT;
2372 *s++ = (int)(ik & 0xff);
2373 *s++ = (int)((ik >> 8) & 0xff);
2374 *s++ = (int)((ik >> 16) & 0xff);
2375 *s++ = (int)((ik >> 24) & 0xff);
2376 }
2377 }
2378 }
2379
2380 }
2381
2382 if (clear) {
2383 PyDict_Clear(self->memo);
2384 Pdata_clear(data,0);
2385 }
2386
2387 free(have_get);
2388 return r;
2389 err:
2390 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002391 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002392}
2393
2394static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002395Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002396{
2397 PyObject *ob;
2398 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002399
Tim Peterscba30e22003-02-01 06:24:36 +00002400 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002401 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002403 if (dump(self, ob) < 0)
2404 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002406 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002408 /* XXX Why does dump() return self? */
2409 Py_INCREF(self);
2410 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002411}
2412
2413
Tim Peterscba30e22003-02-01 06:24:36 +00002414static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002415{
Neal Norwitzb0493252002-03-31 14:44:22 +00002416 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002417 PyDoc_STR("dump(object) -- "
2418 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002419 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002420 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002421 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002422 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002423 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002424};
2425
2426
2427static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002428newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002429{
2430 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002431
Tim Peters5bd2a792003-02-01 16:45:06 +00002432 if (proto < 0)
2433 proto = CURRENT_PROTOCOL_NUMBER;
2434 if (proto > CURRENT_PROTOCOL_NUMBER) {
2435 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2436 "the highest available protocol is %d",
2437 proto, CURRENT_PROTOCOL_NUMBER);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002438 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002439 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002440
Tim Peters5bd2a792003-02-01 16:45:06 +00002441 self = PyObject_New(Picklerobject, &Picklertype);
2442 if (self == NULL)
2443 return NULL;
2444 self->proto = proto;
2445 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002446 self->fp = NULL;
2447 self->write = NULL;
2448 self->memo = NULL;
2449 self->arg = NULL;
2450 self->pers_func = NULL;
2451 self->inst_pers_func = NULL;
2452 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002453 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002454 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002455 self->fast_container = 0;
2456 self->fast_memo = NULL;
2457 self->buf_size = 0;
2458 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002459
Tim Peters5bd2a792003-02-01 16:45:06 +00002460 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002461 if (file)
2462 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002463 else {
2464 file = Pdata_New();
2465 if (file == NULL)
2466 goto err;
2467 }
2468 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002469
Tim Peterscba30e22003-02-01 06:24:36 +00002470 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002471 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002473 if (PyFile_Check(file)) {
2474 self->fp = PyFile_AsFile(file);
2475 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002476 PyErr_SetString(PyExc_ValueError,
2477 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002478 goto err;
2479 }
2480 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002481 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002482 else if (PycStringIO_OutputCheck(file)) {
2483 self->write_func = write_cStringIO;
2484 }
2485 else if (file == Py_None) {
2486 self->write_func = write_none;
2487 }
2488 else {
2489 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002491 if (! Pdata_Check(file)) {
2492 self->write = PyObject_GetAttr(file, write_str);
2493 if (!self->write) {
2494 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002495 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002496 "argument must have 'write' "
2497 "attribute");
2498 goto err;
2499 }
2500 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002501
Tim Peters5bd2a792003-02-01 16:45:06 +00002502 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2503 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002504 PyErr_NoMemory();
2505 goto err;
2506 }
2507 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002509 if (PyEval_GetRestricted()) {
2510 /* Restricted execution, get private tables */
2511 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002512
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002513 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2514 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2515 Py_DECREF(m);
2516 if (!( self->dispatch_table )) goto err;
2517 }
2518 else {
2519 self->dispatch_table=dispatch_table;
2520 Py_INCREF(dispatch_table);
2521 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002523 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002525 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002526 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002527 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002528}
2529
2530
2531static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002532get_Pickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002533{
2534 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002535 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002536
Tim Peters5bd2a792003-02-01 16:45:06 +00002537 /* XXX What is this doing? The documented signature is
2538 * XXX Pickler(file, proto=0), but this accepts Pickler() and
2539 * XXX Pickler(integer) too. The meaning then is clear as mud.
2540 * XXX Bug? Feature?
2541 */
2542 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002543 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002544 proto = 0;
2545 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002546 return NULL;
2547 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002548 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002549}
2550
2551
2552static void
Tim Peterscba30e22003-02-01 06:24:36 +00002553Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002554{
2555 Py_XDECREF(self->write);
2556 Py_XDECREF(self->memo);
2557 Py_XDECREF(self->fast_memo);
2558 Py_XDECREF(self->arg);
2559 Py_XDECREF(self->file);
2560 Py_XDECREF(self->pers_func);
2561 Py_XDECREF(self->inst_pers_func);
2562 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002563 PyMem_Free(self->write_buf);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002564 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002565}
2566
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002567static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002568Pickler_get_pers_func(Picklerobject *p)
2569{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002570 if (p->pers_func == NULL)
2571 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2572 else
2573 Py_INCREF(p->pers_func);
2574 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002575}
2576
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002577static int
2578Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2579{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002580 if (v == NULL) {
2581 PyErr_SetString(PyExc_TypeError,
2582 "attribute deletion is not supported");
2583 return -1;
2584 }
2585 Py_XDECREF(p->pers_func);
2586 Py_INCREF(v);
2587 p->pers_func = v;
2588 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002589}
2590
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002591static int
2592Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2593{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002594 if (v == NULL) {
2595 PyErr_SetString(PyExc_TypeError,
2596 "attribute deletion is not supported");
2597 return -1;
2598 }
2599 Py_XDECREF(p->inst_pers_func);
2600 Py_INCREF(v);
2601 p->inst_pers_func = v;
2602 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002603}
2604
2605static PyObject *
2606Pickler_get_memo(Picklerobject *p)
2607{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002608 if (p->memo == NULL)
2609 PyErr_SetString(PyExc_AttributeError, "memo");
2610 else
2611 Py_INCREF(p->memo);
2612 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002613}
2614
2615static int
2616Pickler_set_memo(Picklerobject *p, PyObject *v)
2617{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002618 if (v == NULL) {
2619 PyErr_SetString(PyExc_TypeError,
2620 "attribute deletion is not supported");
2621 return -1;
2622 }
2623 if (!PyDict_Check(v)) {
2624 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2625 return -1;
2626 }
2627 Py_XDECREF(p->memo);
2628 Py_INCREF(v);
2629 p->memo = v;
2630 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002631}
2632
2633static PyObject *
2634Pickler_get_error(Picklerobject *p)
2635{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002636 /* why is this an attribute on the Pickler? */
2637 Py_INCREF(PicklingError);
2638 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002639}
2640
2641static PyMemberDef Pickler_members[] = {
2642 {"binary", T_INT, offsetof(Picklerobject, bin)},
2643 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002644 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002645};
2646
2647static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002648 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002649 (setter)Pickler_set_pers_func},
2650 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2651 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002652 {"PicklingError", (getter)Pickler_get_error, NULL},
2653 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002654};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002655
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002656PyDoc_STRVAR(Picklertype__doc__,
2657"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002658
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002659static PyTypeObject Picklertype = {
2660 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002661 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002662 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002663 sizeof(Picklerobject), /*tp_basicsize*/
2664 0,
2665 (destructor)Pickler_dealloc, /* tp_dealloc */
2666 0, /* tp_print */
2667 0, /* tp_getattr */
2668 0, /* tp_setattr */
2669 0, /* tp_compare */
2670 0, /* tp_repr */
2671 0, /* tp_as_number */
2672 0, /* tp_as_sequence */
2673 0, /* tp_as_mapping */
2674 0, /* tp_hash */
2675 0, /* tp_call */
2676 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002677 PyObject_GenericGetAttr, /* tp_getattro */
2678 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002679 0, /* tp_as_buffer */
2680 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2681 Picklertype__doc__, /* tp_doc */
2682 0, /* tp_traverse */
2683 0, /* tp_clear */
2684 0, /* tp_richcompare */
2685 0, /* tp_weaklistoffset */
2686 0, /* tp_iter */
2687 0, /* tp_iternext */
2688 Pickler_methods, /* tp_methods */
2689 Pickler_members, /* tp_members */
2690 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002691};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002692
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002693static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002694find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002695{
2696 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002698 if (fc) {
2699 if (fc==Py_None) {
2700 PyErr_SetString(UnpicklingError,
2701 "Global and instance pickles are not supported.");
2702 return NULL;
2703 }
Tim Peterscba30e22003-02-01 06:24:36 +00002704 return PyObject_CallFunction(fc, "OO", py_module_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002705 py_global_name);
2706 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002708 module = PySys_GetObject("modules");
2709 if (module == NULL)
2710 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002712 module = PyDict_GetItem(module, py_module_name);
2713 if (module == NULL) {
2714 module = PyImport_Import(py_module_name);
2715 if (!module)
2716 return NULL;
2717 global = PyObject_GetAttr(module, py_global_name);
2718 Py_DECREF(module);
2719 }
2720 else
2721 global = PyObject_GetAttr(module, py_global_name);
2722 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002723}
2724
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002725static int
Tim Peterscba30e22003-02-01 06:24:36 +00002726marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002727{
2728 if (self->num_marks < 1) {
2729 PyErr_SetString(UnpicklingError, "could not find MARK");
2730 return -1;
2731 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002732
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002733 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002734}
2735
Tim Peters84e87f32001-03-17 04:50:51 +00002736
Guido van Rossum60456fd1997-04-09 17:36:32 +00002737static int
Tim Peterscba30e22003-02-01 06:24:36 +00002738load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002739{
2740 PDATA_APPEND(self->stack, Py_None, -1);
2741 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002742}
2743
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002744static int
Tim Peterscba30e22003-02-01 06:24:36 +00002745bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002746{
2747 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2748 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002749}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002750
2751static int
Tim Peterscba30e22003-02-01 06:24:36 +00002752load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002753{
2754 PyObject *py_int = 0;
2755 char *endptr, *s;
2756 int len, res = -1;
2757 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002759 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2760 if (len < 2) return bad_readline();
2761 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002763 errno = 0;
2764 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002765
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002766 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2767 /* Hm, maybe we've got something long. Let's try reading
2768 it as a Python long object. */
2769 errno = 0;
2770 py_int = PyLong_FromString(s, NULL, 0);
2771 if (py_int == NULL) {
2772 PyErr_SetString(PyExc_ValueError,
2773 "could not convert string to int");
2774 goto finally;
2775 }
2776 }
2777 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002778 if (len == 3 && (l == 0 || l == 1)) {
2779 if (!( py_int = PyBool_FromLong(l))) goto finally;
2780 }
2781 else {
2782 if (!( py_int = PyInt_FromLong(l))) goto finally;
2783 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002784 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002785
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002786 free(s);
2787 PDATA_PUSH(self->stack, py_int, -1);
2788 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002789
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002790 finally:
2791 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002793 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002794}
2795
Tim Peters3c67d792003-02-02 17:59:11 +00002796static int
2797load_bool(Unpicklerobject *self, PyObject *boolean)
2798{
2799 assert(boolean == Py_True || boolean == Py_False);
2800 Py_INCREF(boolean);
2801 PDATA_PUSH(self->stack, boolean, -1);
2802 return 0;
2803}
2804
Tim Petersee1a53c2003-02-02 02:57:53 +00002805/* s contains x bytes of a little-endian integer. Return its value as a
2806 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
2807 * int, but when x is 4 it's a signed one. This is an historical source
2808 * of x-platform bugs.
2809 */
Tim Peters84e87f32001-03-17 04:50:51 +00002810static long
Tim Petersee1a53c2003-02-02 02:57:53 +00002811calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002812{
2813 unsigned char c;
2814 int i;
2815 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002817 for (i = 0, l = 0L; i < x; i++) {
2818 c = (unsigned char)s[i];
2819 l |= (long)c << (i * 8);
2820 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002821#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002822 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2823 * is signed, so on a box with longs bigger than 4 bytes we need
2824 * to extend a BININT's sign bit to the full width.
2825 */
2826 if (x == 4 && l & (1L << 31))
2827 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002828#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002829 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002830}
2831
2832
2833static int
Tim Peterscba30e22003-02-01 06:24:36 +00002834load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002835{
2836 PyObject *py_int = 0;
2837 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002839 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002840
Tim Peterscba30e22003-02-01 06:24:36 +00002841 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002842 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002844 PDATA_PUSH(self->stack, py_int, -1);
2845 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002846}
2847
2848
2849static int
Tim Peterscba30e22003-02-01 06:24:36 +00002850load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002851{
2852 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002854 if ((*self->read_func)(self, &s, 4) < 0)
2855 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002857 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002858}
2859
2860
2861static int
Tim Peterscba30e22003-02-01 06:24:36 +00002862load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002863{
2864 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002866 if ((*self->read_func)(self, &s, 1) < 0)
2867 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002869 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002870}
2871
2872
2873static int
Tim Peterscba30e22003-02-01 06:24:36 +00002874load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002875{
2876 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002877
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002878 if ((*self->read_func)(self, &s, 2) < 0)
2879 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002880
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002881 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002882}
Tim Peters84e87f32001-03-17 04:50:51 +00002883
Guido van Rossum60456fd1997-04-09 17:36:32 +00002884static int
Tim Peterscba30e22003-02-01 06:24:36 +00002885load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002886{
2887 PyObject *l = 0;
2888 char *end, *s;
2889 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002891 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2892 if (len < 2) return bad_readline();
2893 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002894
Tim Peterscba30e22003-02-01 06:24:36 +00002895 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002896 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002898 free(s);
2899 PDATA_PUSH(self->stack, l, -1);
2900 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002901
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002902 finally:
2903 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002904
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002905 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002906}
2907
Tim Petersee1a53c2003-02-02 02:57:53 +00002908/* 'size' bytes contain the # of bytes of little-endian 256's-complement
2909 * data following.
2910 */
2911static int
2912load_counted_long(Unpicklerobject *self, int size)
2913{
2914 int i;
2915 char *nbytes;
2916 unsigned char *pdata;
2917 PyObject *along;
2918
2919 assert(size == 1 || size == 4);
2920 i = self->read_func(self, &nbytes, size);
2921 if (i < 0) return -1;
2922
2923 size = calc_binint(nbytes, size);
2924 if (size < 0) {
2925 /* Corrupt or hostile pickle -- we never write one like
2926 * this.
2927 */
2928 PyErr_SetString(PyExc_ValueError, "LONG pickle has negative "
2929 "byte count");
2930 return -1;
2931 }
2932
2933 if (size == 0)
2934 along = PyLong_FromLong(0L);
2935 else {
2936 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00002937 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00002938 if (i < 0) return -1;
2939 along = _PyLong_FromByteArray(pdata, (size_t)size,
2940 1 /* little endian */, 1 /* signed */);
2941 }
2942 if (along == NULL)
2943 return -1;
2944 PDATA_PUSH(self->stack, along, -1);
2945 return 0;
2946}
Tim Peters84e87f32001-03-17 04:50:51 +00002947
Guido van Rossum60456fd1997-04-09 17:36:32 +00002948static int
Tim Peterscba30e22003-02-01 06:24:36 +00002949load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002950{
2951 PyObject *py_float = 0;
2952 char *endptr, *s;
2953 int len, res = -1;
2954 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002955
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002956 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2957 if (len < 2) return bad_readline();
2958 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002959
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002960 errno = 0;
2961 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002963 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2964 PyErr_SetString(PyExc_ValueError,
2965 "could not convert string to float");
2966 goto finally;
2967 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002968
Tim Peterscba30e22003-02-01 06:24:36 +00002969 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002970 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002971
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002972 free(s);
2973 PDATA_PUSH(self->stack, py_float, -1);
2974 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002975
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002976 finally:
2977 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002978
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002979 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002980}
2981
Guido van Rossum60456fd1997-04-09 17:36:32 +00002982static int
Tim Peterscba30e22003-02-01 06:24:36 +00002983load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002984{
2985 PyObject *py_float = 0;
2986 int s, e;
2987 long fhi, flo;
2988 double x;
2989 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002990
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002991 if ((*self->read_func)(self, &p, 8) < 0)
2992 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002993
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002994 /* First byte */
2995 s = (*p>>7) & 1;
2996 e = (*p & 0x7F) << 4;
2997 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002998
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002999 /* Second byte */
3000 e |= (*p>>4) & 0xF;
3001 fhi = (*p & 0xF) << 24;
3002 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003004 /* Third byte */
3005 fhi |= (*p & 0xFF) << 16;
3006 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003007
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003008 /* Fourth byte */
3009 fhi |= (*p & 0xFF) << 8;
3010 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003011
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003012 /* Fifth byte */
3013 fhi |= *p & 0xFF;
3014 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003015
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003016 /* Sixth byte */
3017 flo = (*p & 0xFF) << 16;
3018 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003019
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003020 /* Seventh byte */
3021 flo |= (*p & 0xFF) << 8;
3022 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003024 /* Eighth byte */
3025 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003026
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003027 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
3028 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003029
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003030 /* XXX This sadly ignores Inf/NaN */
3031 if (e == 0)
3032 e = -1022;
3033 else {
3034 x += 1.0;
3035 e -= 1023;
3036 }
3037 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003039 if (s)
3040 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003042 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003043
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003044 PDATA_PUSH(self->stack, py_float, -1);
3045 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003046}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003047
3048static int
Tim Peterscba30e22003-02-01 06:24:36 +00003049load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003050{
3051 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003052 int len, res = -1;
3053 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003054
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003055 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3056 if (len < 2) return bad_readline();
3057 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003058
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003059
3060 /* Strip outermost quotes */
3061 while (s[len-1] <= ' ')
3062 len--;
3063 if(s[0]=='"' && s[len-1]=='"'){
3064 s[len-1] = '\0';
3065 p = s + 1 ;
3066 len -= 2;
3067 } else if(s[0]=='\'' && s[len-1]=='\''){
3068 s[len-1] = '\0';
3069 p = s + 1 ;
3070 len -= 2;
3071 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003072 goto insecure;
3073 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003074
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003075 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
3076 if (str) {
3077 PDATA_PUSH(self->stack, str, -1);
3078 res = 0;
3079 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003080 free(s);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003081 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003083 insecure:
3084 free(s);
3085 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3086 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003087}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003088
3089
3090static int
Tim Peterscba30e22003-02-01 06:24:36 +00003091load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003092{
3093 PyObject *py_string = 0;
3094 long l;
3095 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003096
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003097 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003099 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003100
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003101 if ((*self->read_func)(self, &s, l) < 0)
3102 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003103
Tim Peterscba30e22003-02-01 06:24:36 +00003104 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003105 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003107 PDATA_PUSH(self->stack, py_string, -1);
3108 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003109}
3110
3111
3112static int
Tim Peterscba30e22003-02-01 06:24:36 +00003113load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003114{
3115 PyObject *py_string = 0;
3116 unsigned char l;
3117 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003119 if ((*self->read_func)(self, &s, 1) < 0)
3120 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003122 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003123
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003124 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003125
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003126 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003128 PDATA_PUSH(self->stack, py_string, -1);
3129 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003130}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003131
3132
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003133#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003134static int
Tim Peterscba30e22003-02-01 06:24:36 +00003135load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003136{
3137 PyObject *str = 0;
3138 int len, res = -1;
3139 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003140
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003141 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3142 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003143
Tim Peterscba30e22003-02-01 06:24:36 +00003144 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003145 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003147 PDATA_PUSH(self->stack, str, -1);
3148 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003149
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003150 finally:
3151 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003152}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003153#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003154
3155
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003156#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003157static int
Tim Peterscba30e22003-02-01 06:24:36 +00003158load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003159{
3160 PyObject *unicode;
3161 long l;
3162 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003164 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003166 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003168 if ((*self->read_func)(self, &s, l) < 0)
3169 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003170
Tim Peterscba30e22003-02-01 06:24:36 +00003171 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003172 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003173
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003174 PDATA_PUSH(self->stack, unicode, -1);
3175 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003176}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003177#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003178
3179
3180static int
Tim Peterscba30e22003-02-01 06:24:36 +00003181load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003182{
3183 PyObject *tup;
3184 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003185
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003186 if ((i = marker(self)) < 0) return -1;
3187 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3188 PDATA_PUSH(self->stack, tup, -1);
3189 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003190}
3191
3192static int
Tim Peterscba30e22003-02-01 06:24:36 +00003193load_empty_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003194{
3195 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003197 if (!( tup=PyTuple_New(0))) return -1;
3198 PDATA_PUSH(self->stack, tup, -1);
3199 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003200}
3201
3202static int
Tim Peterscba30e22003-02-01 06:24:36 +00003203load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003204{
3205 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003206
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003207 if (!( list=PyList_New(0))) return -1;
3208 PDATA_PUSH(self->stack, list, -1);
3209 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003210}
3211
3212static int
Tim Peterscba30e22003-02-01 06:24:36 +00003213load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003214{
3215 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003217 if (!( dict=PyDict_New())) return -1;
3218 PDATA_PUSH(self->stack, dict, -1);
3219 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003220}
3221
3222
3223static int
Tim Peterscba30e22003-02-01 06:24:36 +00003224load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003225{
3226 PyObject *list = 0;
3227 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003228
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003229 if ((i = marker(self)) < 0) return -1;
3230 if (!( list=Pdata_popList(self->stack, i))) return -1;
3231 PDATA_PUSH(self->stack, list, -1);
3232 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003233}
3234
3235static int
Tim Peterscba30e22003-02-01 06:24:36 +00003236load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003237{
3238 PyObject *dict, *key, *value;
3239 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003240
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003241 if ((i = marker(self)) < 0) return -1;
3242 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003243
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003244 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003245
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003246 for (k = i+1; k < j; k += 2) {
3247 key =self->stack->data[k-1];
3248 value=self->stack->data[k ];
3249 if (PyDict_SetItem(dict, key, value) < 0) {
3250 Py_DECREF(dict);
3251 return -1;
3252 }
3253 }
3254 Pdata_clear(self->stack, i);
3255 PDATA_PUSH(self->stack, dict, -1);
3256 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003257}
3258
3259static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003260Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003261{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003262 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003263
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003264 if (PyClass_Check(cls)) {
3265 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003266
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003267 if ((l=PyObject_Size(args)) < 0) goto err;
3268 if (!( l )) {
3269 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003270
Tim Peterscba30e22003-02-01 06:24:36 +00003271 __getinitargs__ = PyObject_GetAttr(cls,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003272 __getinitargs___str);
3273 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003274 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003275 so bypass usual construction */
3276 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003278 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003279 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003280 goto err;
3281 return inst;
3282 }
3283 Py_DECREF(__getinitargs__);
3284 }
Tim Peters84e87f32001-03-17 04:50:51 +00003285
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003286 if ((r=PyInstance_New(cls, args, NULL))) return r;
3287 else goto err;
3288 }
Tim Peters84e87f32001-03-17 04:50:51 +00003289
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003290 if (args==Py_None) {
3291 /* Special case, call cls.__basicnew__() */
3292 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003294 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3295 if (!basicnew) return NULL;
3296 r=PyObject_CallObject(basicnew, NULL);
3297 Py_DECREF(basicnew);
3298 if (r) return r;
3299 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003300
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003301 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003303 err:
3304 {
3305 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003306
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003307 PyErr_Fetch(&tp, &v, &tb);
3308 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3309 Py_XDECREF(v);
3310 v=r;
3311 }
3312 PyErr_Restore(tp,v,tb);
3313 }
3314 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003315}
Tim Peters84e87f32001-03-17 04:50:51 +00003316
Guido van Rossum60456fd1997-04-09 17:36:32 +00003317
3318static int
Tim Peterscba30e22003-02-01 06:24:36 +00003319load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003320{
3321 PyObject *class, *tup, *obj=0;
3322 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003323
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003324 if ((i = marker(self)) < 0) return -1;
3325 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3326 PDATA_POP(self->stack, class);
3327 if (class) {
3328 obj = Instance_New(class, tup);
3329 Py_DECREF(class);
3330 }
3331 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003332
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003333 if (! obj) return -1;
3334 PDATA_PUSH(self->stack, obj, -1);
3335 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003336}
3337
3338
3339static int
Tim Peterscba30e22003-02-01 06:24:36 +00003340load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003341{
3342 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3343 int i, len;
3344 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003345
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003346 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003347
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003348 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3349 if (len < 2) return bad_readline();
3350 module_name = PyString_FromStringAndSize(s, len - 1);
3351 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003353 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3354 if (len < 2) return bad_readline();
3355 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003356 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003357 self->find_class);
3358 Py_DECREF(class_name);
3359 }
3360 }
3361 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003362
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003363 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003364
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003365 if ((tup=Pdata_popTuple(self->stack, i))) {
3366 obj = Instance_New(class, tup);
3367 Py_DECREF(tup);
3368 }
3369 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003371 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003372
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003373 PDATA_PUSH(self->stack, obj, -1);
3374 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003375}
3376
3377
3378static int
Tim Peterscba30e22003-02-01 06:24:36 +00003379load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003380{
3381 PyObject *class = 0, *module_name = 0, *class_name = 0;
3382 int len;
3383 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003385 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3386 if (len < 2) return bad_readline();
3387 module_name = PyString_FromStringAndSize(s, len - 1);
3388 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003389
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003390 if ((len = (*self->readline_func)(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003391 if (len < 2) {
3392 Py_DECREF(module_name);
3393 return bad_readline();
3394 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003395 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003396 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003397 self->find_class);
3398 Py_DECREF(class_name);
3399 }
3400 }
3401 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003403 if (! class) return -1;
3404 PDATA_PUSH(self->stack, class, -1);
3405 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003406}
3407
3408
3409static int
Tim Peterscba30e22003-02-01 06:24:36 +00003410load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003411{
3412 PyObject *pid = 0;
3413 int len;
3414 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003415
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003416 if (self->pers_func) {
3417 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3418 if (len < 2) return bad_readline();
3419
3420 pid = PyString_FromStringAndSize(s, len - 1);
3421 if (!pid) return -1;
3422
3423 if (PyList_Check(self->pers_func)) {
3424 if (PyList_Append(self->pers_func, pid) < 0) {
3425 Py_DECREF(pid);
3426 return -1;
3427 }
3428 }
3429 else {
3430 ARG_TUP(self, pid);
3431 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003432 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003433 NULL);
3434 FREE_ARG_TUP(self);
3435 }
3436 }
3437
3438 if (! pid) return -1;
3439
3440 PDATA_PUSH(self->stack, pid, -1);
3441 return 0;
3442 }
3443 else {
3444 PyErr_SetString(UnpicklingError,
3445 "A load persistent id instruction was encountered,\n"
3446 "but no persistent_load function was specified.");
3447 return -1;
3448 }
3449}
3450
3451static int
Tim Peterscba30e22003-02-01 06:24:36 +00003452load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003453{
3454 PyObject *pid = 0;
3455
3456 if (self->pers_func) {
3457 PDATA_POP(self->stack, pid);
3458 if (! pid) return -1;
3459
3460 if (PyList_Check(self->pers_func)) {
3461 if (PyList_Append(self->pers_func, pid) < 0) {
3462 Py_DECREF(pid);
3463 return -1;
3464 }
3465 }
3466 else {
3467 ARG_TUP(self, pid);
3468 if (self->arg) {
3469 pid = PyObject_Call(self->pers_func, self->arg,
3470 NULL);
3471 FREE_ARG_TUP(self);
3472 }
3473 if (! pid) return -1;
3474 }
3475
3476 PDATA_PUSH(self->stack, pid, -1);
3477 return 0;
3478 }
3479 else {
3480 PyErr_SetString(UnpicklingError,
3481 "A load persistent id instruction was encountered,\n"
3482 "but no persistent_load function was specified.");
3483 return -1;
3484 }
3485}
3486
3487
3488static int
Tim Peterscba30e22003-02-01 06:24:36 +00003489load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003490{
3491 int len;
3492
3493 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3494
3495 /* Note that we split the (pickle.py) stack into two stacks,
3496 an object stack and a mark stack. We have to be clever and
3497 pop the right one. We do this by looking at the top of the
3498 mark stack.
3499 */
3500
3501 if ((self->num_marks > 0) &&
3502 (self->marks[self->num_marks - 1] == len))
3503 self->num_marks--;
3504 else {
3505 len--;
3506 Py_DECREF(self->stack->data[len]);
3507 self->stack->length=len;
3508 }
3509
3510 return 0;
3511}
3512
3513
3514static int
Tim Peterscba30e22003-02-01 06:24:36 +00003515load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003516{
3517 int i;
3518
3519 if ((i = marker(self)) < 0)
3520 return -1;
3521
3522 Pdata_clear(self->stack, i);
3523
3524 return 0;
3525}
3526
3527
3528static int
Tim Peterscba30e22003-02-01 06:24:36 +00003529load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003530{
3531 PyObject *last;
3532 int len;
3533
3534 if ((len = self->stack->length) <= 0) return stackUnderflow();
3535 last=self->stack->data[len-1];
3536 Py_INCREF(last);
3537 PDATA_PUSH(self->stack, last, -1);
3538 return 0;
3539}
3540
3541
3542static int
Tim Peterscba30e22003-02-01 06:24:36 +00003543load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003544{
3545 PyObject *py_str = 0, *value = 0;
3546 int len;
3547 char *s;
3548 int rc;
3549
3550 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003551 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003552
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003553 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003555 value = PyDict_GetItem(self->memo, py_str);
3556 if (! value) {
3557 PyErr_SetObject(BadPickleGet, py_str);
3558 rc = -1;
3559 } else {
3560 PDATA_APPEND(self->stack, value, -1);
3561 rc = 0;
3562 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003564 Py_DECREF(py_str);
3565 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003566}
3567
3568
3569static int
Tim Peterscba30e22003-02-01 06:24:36 +00003570load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003571{
3572 PyObject *py_key = 0, *value = 0;
3573 unsigned char key;
3574 char *s;
3575 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003577 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003579 key = (unsigned char)s[0];
3580 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003581
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003582 value = PyDict_GetItem(self->memo, py_key);
3583 if (! value) {
3584 PyErr_SetObject(BadPickleGet, py_key);
3585 rc = -1;
3586 } else {
3587 PDATA_APPEND(self->stack, value, -1);
3588 rc = 0;
3589 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003590
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003591 Py_DECREF(py_key);
3592 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003593}
3594
3595
3596static int
Tim Peterscba30e22003-02-01 06:24:36 +00003597load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003598{
3599 PyObject *py_key = 0, *value = 0;
3600 unsigned char c;
3601 char *s;
3602 long key;
3603 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003604
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003605 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003607 c = (unsigned char)s[0];
3608 key = (long)c;
3609 c = (unsigned char)s[1];
3610 key |= (long)c << 8;
3611 c = (unsigned char)s[2];
3612 key |= (long)c << 16;
3613 c = (unsigned char)s[3];
3614 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003615
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003616 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3617
3618 value = PyDict_GetItem(self->memo, py_key);
3619 if (! value) {
3620 PyErr_SetObject(BadPickleGet, py_key);
3621 rc = -1;
3622 } else {
3623 PDATA_APPEND(self->stack, value, -1);
3624 rc = 0;
3625 }
3626
3627 Py_DECREF(py_key);
3628 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003629}
3630
3631
3632static int
Tim Peterscba30e22003-02-01 06:24:36 +00003633load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003634{
3635 PyObject *py_str = 0, *value = 0;
3636 int len, l;
3637 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003638
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003639 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
3640 if (l < 2) return bad_readline();
3641 if (!( len=self->stack->length )) return stackUnderflow();
3642 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3643 value=self->stack->data[len-1];
3644 l=PyDict_SetItem(self->memo, py_str, value);
3645 Py_DECREF(py_str);
3646 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003647}
3648
3649
3650static int
Tim Peterscba30e22003-02-01 06:24:36 +00003651load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003652{
3653 PyObject *py_key = 0, *value = 0;
3654 unsigned char key;
3655 char *s;
3656 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003657
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003658 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3659 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003660
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003661 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003662
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003663 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3664 value=self->stack->data[len-1];
3665 len=PyDict_SetItem(self->memo, py_key, value);
3666 Py_DECREF(py_key);
3667 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003668}
3669
3670
3671static int
Tim Peterscba30e22003-02-01 06:24:36 +00003672load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003673{
3674 PyObject *py_key = 0, *value = 0;
3675 long key;
3676 unsigned char c;
3677 char *s;
3678 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003680 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3681 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003683 c = (unsigned char)s[0];
3684 key = (long)c;
3685 c = (unsigned char)s[1];
3686 key |= (long)c << 8;
3687 c = (unsigned char)s[2];
3688 key |= (long)c << 16;
3689 c = (unsigned char)s[3];
3690 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003691
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003692 if (!( py_key = PyInt_FromLong(key))) return -1;
3693 value=self->stack->data[len-1];
3694 len=PyDict_SetItem(self->memo, py_key, value);
3695 Py_DECREF(py_key);
3696 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003697}
3698
3699
3700static int
Tim Peterscba30e22003-02-01 06:24:36 +00003701do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003702{
3703 PyObject *value = 0, *list = 0, *append_method = 0;
3704 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003706 len=self->stack->length;
3707 if (!( len >= x && x > 0 )) return stackUnderflow();
3708 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003709 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003711 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003713 if (PyList_Check(list)) {
3714 PyObject *slice;
3715 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003716
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003717 slice=Pdata_popList(self->stack, x);
3718 list_len = PyList_GET_SIZE(list);
3719 i=PyList_SetSlice(list, list_len, list_len, slice);
3720 Py_DECREF(slice);
3721 return i;
3722 }
3723 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003724
Tim Peterscba30e22003-02-01 06:24:36 +00003725 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003726 return -1;
3727
3728 for (i = x; i < len; i++) {
3729 PyObject *junk;
3730
3731 value=self->stack->data[i];
3732 junk=0;
3733 ARG_TUP(self, value);
3734 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003735 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003736 NULL);
3737 FREE_ARG_TUP(self);
3738 }
3739 if (! junk) {
3740 Pdata_clear(self->stack, i+1);
3741 self->stack->length=x;
3742 Py_DECREF(append_method);
3743 return -1;
3744 }
3745 Py_DECREF(junk);
3746 }
3747 self->stack->length=x;
3748 Py_DECREF(append_method);
3749 }
3750
3751 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003752}
3753
3754
3755static int
Tim Peterscba30e22003-02-01 06:24:36 +00003756load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003757{
3758 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003759}
3760
3761
3762static int
Tim Peterscba30e22003-02-01 06:24:36 +00003763load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003764{
3765 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003766}
3767
3768
3769static int
Tim Peterscba30e22003-02-01 06:24:36 +00003770do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003771{
3772 PyObject *value = 0, *key = 0, *dict = 0;
3773 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003775 if (!( (len=self->stack->length) >= x
3776 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003778 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003780 for (i = x+1; i < len; i += 2) {
3781 key =self->stack->data[i-1];
3782 value=self->stack->data[i ];
3783 if (PyObject_SetItem(dict, key, value) < 0) {
3784 r=-1;
3785 break;
3786 }
3787 }
3788
3789 Pdata_clear(self->stack, x);
3790
3791 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003792}
3793
3794
Tim Peters84e87f32001-03-17 04:50:51 +00003795static int
Tim Peterscba30e22003-02-01 06:24:36 +00003796load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003797{
3798 return do_setitems(self, self->stack->length - 2);
3799}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003800
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003801static int
Tim Peterscba30e22003-02-01 06:24:36 +00003802load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003803{
3804 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003805}
3806
Tim Peters84e87f32001-03-17 04:50:51 +00003807
Guido van Rossum60456fd1997-04-09 17:36:32 +00003808static int
Tim Peterscba30e22003-02-01 06:24:36 +00003809load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003810{
3811 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3812 *junk = 0, *__setstate__ = 0;
3813 int i, r = 0;
3814
3815 if (self->stack->length < 2) return stackUnderflow();
3816 PDATA_POP(self->stack, value);
3817 if (! value) return -1;
3818 inst=self->stack->data[self->stack->length-1];
3819
3820 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3821 ARG_TUP(self, value);
3822 if (self->arg) {
3823 junk = PyObject_Call(__setstate__, self->arg, NULL);
3824 FREE_ARG_TUP(self);
3825 }
3826 Py_DECREF(__setstate__);
3827 if (! junk) return -1;
3828 Py_DECREF(junk);
3829 return 0;
3830 }
3831
3832 PyErr_Clear();
3833 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3834 i = 0;
3835 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3836 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3837 r=-1;
3838 break;
3839 }
3840 }
3841 Py_DECREF(instdict);
3842 }
3843 else r=-1;
3844
3845 Py_XDECREF(value);
3846
3847 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003848}
3849
3850
3851static int
Tim Peterscba30e22003-02-01 06:24:36 +00003852load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003853{
3854 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003855
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003856 /* Note that we split the (pickle.py) stack into two stacks, an
3857 object stack and a mark stack. Here we push a mark onto the
3858 mark stack.
3859 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003861 if ((self->num_marks + 1) >= self->marks_size) {
3862 s=self->marks_size+20;
3863 if (s <= self->num_marks) s=self->num_marks + 1;
3864 if (self->marks == NULL)
3865 self->marks=(int *)malloc(s * sizeof(int));
3866 else
Tim Peterscba30e22003-02-01 06:24:36 +00003867 self->marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003868 s * sizeof(int));
3869 if (! self->marks) {
3870 PyErr_NoMemory();
3871 return -1;
3872 }
3873 self->marks_size = s;
3874 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003876 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003877
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003878 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003879}
3880
Guido van Rossum60456fd1997-04-09 17:36:32 +00003881static int
Tim Peterscba30e22003-02-01 06:24:36 +00003882load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003883{
3884 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003886 PDATA_POP(self->stack, arg_tup);
3887 if (! arg_tup) return -1;
3888 PDATA_POP(self->stack, callable);
3889 if (callable) {
3890 ob = Instance_New(callable, arg_tup);
3891 Py_DECREF(callable);
3892 }
3893 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003895 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003897 PDATA_PUSH(self->stack, ob, -1);
3898 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003899}
Tim Peters84e87f32001-03-17 04:50:51 +00003900
Tim Peters4190fb82003-02-02 16:09:05 +00003901/* Just raises an error if we don't know the protocol specified. PROTO
3902 * is the first opcode for protocols >= 2.
3903 */
3904static int
3905load_proto(Unpicklerobject *self)
3906{
3907 int i;
3908 char *protobyte;
3909
3910 i = self->read_func(self, &protobyte, 1);
3911 if (i < 0)
3912 return -1;
3913
3914 i = calc_binint(protobyte, 1);
3915 /* No point checking for < 0, since calc_binint returns an unsigned
3916 * int when chewing on 1 byte.
3917 */
3918 assert(i >= 0);
3919 if (i <= CURRENT_PROTOCOL_NUMBER)
3920 return 0;
3921
3922 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
3923 return -1;
3924}
3925
Guido van Rossum60456fd1997-04-09 17:36:32 +00003926static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003927load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003928{
3929 PyObject *err = 0, *val = 0;
3930 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003931
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003932 self->num_marks = 0;
3933 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003935 while (1) {
3936 if ((*self->read_func)(self, &s, 1) < 0)
3937 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003939 switch (s[0]) {
3940 case NONE:
3941 if (load_none(self) < 0)
3942 break;
3943 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003945 case BININT:
3946 if (load_binint(self) < 0)
3947 break;
3948 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003949
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003950 case BININT1:
3951 if (load_binint1(self) < 0)
3952 break;
3953 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003955 case BININT2:
3956 if (load_binint2(self) < 0)
3957 break;
3958 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003959
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003960 case INT:
3961 if (load_int(self) < 0)
3962 break;
3963 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003964
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003965 case LONG:
3966 if (load_long(self) < 0)
3967 break;
3968 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003969
Tim Petersee1a53c2003-02-02 02:57:53 +00003970 case LONG1:
3971 if (load_counted_long(self, 1) < 0)
3972 break;
3973 continue;
3974
3975 case LONG4:
3976 if (load_counted_long(self, 4) < 0)
3977 break;
3978 continue;
3979
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003980 case FLOAT:
3981 if (load_float(self) < 0)
3982 break;
3983 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003984
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003985 case BINFLOAT:
3986 if (load_binfloat(self) < 0)
3987 break;
3988 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003989
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003990 case BINSTRING:
3991 if (load_binstring(self) < 0)
3992 break;
3993 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003994
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003995 case SHORT_BINSTRING:
3996 if (load_short_binstring(self) < 0)
3997 break;
3998 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003999
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004000 case STRING:
4001 if (load_string(self) < 0)
4002 break;
4003 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004004
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004005#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004006 case UNICODE:
4007 if (load_unicode(self) < 0)
4008 break;
4009 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004010
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004011 case BINUNICODE:
4012 if (load_binunicode(self) < 0)
4013 break;
4014 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004015#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004016
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004017 case EMPTY_TUPLE:
4018 if (load_empty_tuple(self) < 0)
4019 break;
4020 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004021
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004022 case TUPLE:
4023 if (load_tuple(self) < 0)
4024 break;
4025 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004026
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004027 case EMPTY_LIST:
4028 if (load_empty_list(self) < 0)
4029 break;
4030 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004031
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004032 case LIST:
4033 if (load_list(self) < 0)
4034 break;
4035 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004036
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004037 case EMPTY_DICT:
4038 if (load_empty_dict(self) < 0)
4039 break;
4040 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004042 case DICT:
4043 if (load_dict(self) < 0)
4044 break;
4045 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004046
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004047 case OBJ:
4048 if (load_obj(self) < 0)
4049 break;
4050 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004051
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004052 case INST:
4053 if (load_inst(self) < 0)
4054 break;
4055 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004057 case GLOBAL:
4058 if (load_global(self) < 0)
4059 break;
4060 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004061
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004062 case APPEND:
4063 if (load_append(self) < 0)
4064 break;
4065 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004066
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004067 case APPENDS:
4068 if (load_appends(self) < 0)
4069 break;
4070 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004072 case BUILD:
4073 if (load_build(self) < 0)
4074 break;
4075 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004076
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004077 case DUP:
4078 if (load_dup(self) < 0)
4079 break;
4080 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004082 case BINGET:
4083 if (load_binget(self) < 0)
4084 break;
4085 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004087 case LONG_BINGET:
4088 if (load_long_binget(self) < 0)
4089 break;
4090 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004091
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004092 case GET:
4093 if (load_get(self) < 0)
4094 break;
4095 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004096
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004097 case MARK:
4098 if (load_mark(self) < 0)
4099 break;
4100 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004101
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004102 case BINPUT:
4103 if (load_binput(self) < 0)
4104 break;
4105 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004107 case LONG_BINPUT:
4108 if (load_long_binput(self) < 0)
4109 break;
4110 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004111
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004112 case PUT:
4113 if (load_put(self) < 0)
4114 break;
4115 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004117 case POP:
4118 if (load_pop(self) < 0)
4119 break;
4120 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004122 case POP_MARK:
4123 if (load_pop_mark(self) < 0)
4124 break;
4125 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004127 case SETITEM:
4128 if (load_setitem(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 SETITEMS:
4133 if (load_setitems(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 STOP:
4138 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004140 case PERSID:
4141 if (load_persid(self) < 0)
4142 break;
4143 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004144
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004145 case BINPERSID:
4146 if (load_binpersid(self) < 0)
4147 break;
4148 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004149
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004150 case REDUCE:
4151 if (load_reduce(self) < 0)
4152 break;
4153 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004154
Tim Peters4190fb82003-02-02 16:09:05 +00004155 case PROTO:
4156 if (load_proto(self) < 0)
4157 break;
4158 continue;
4159
Tim Peters3c67d792003-02-02 17:59:11 +00004160 case NEWTRUE:
4161 if (load_bool(self, Py_True) < 0)
4162 break;
4163 continue;
4164
4165 case NEWFALSE:
4166 if (load_bool(self, Py_False) < 0)
4167 break;
4168 continue;
4169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004170 case '\0':
4171 /* end of file */
4172 PyErr_SetNone(PyExc_EOFError);
4173 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004174
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004175 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004176 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004177 "invalid load key, '%s'.",
4178 "c", s[0]);
4179 return NULL;
4180 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004182 break;
4183 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004185 if ((err = PyErr_Occurred())) {
4186 if (err == PyExc_EOFError) {
4187 PyErr_SetNone(PyExc_EOFError);
4188 }
4189 return NULL;
4190 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004192 PDATA_POP(self->stack, val);
4193 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004194}
Tim Peters84e87f32001-03-17 04:50:51 +00004195
Guido van Rossum60456fd1997-04-09 17:36:32 +00004196
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004197/* No-load functions to support noload, which is used to
4198 find persistent references. */
4199
4200static int
Tim Peterscba30e22003-02-01 06:24:36 +00004201noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004202{
4203 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004205 if ((i = marker(self)) < 0) return -1;
4206 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004207}
4208
4209
4210static int
Tim Peterscba30e22003-02-01 06:24:36 +00004211noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004212{
4213 int i;
4214 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004215
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004216 if ((i = marker(self)) < 0) return -1;
4217 Pdata_clear(self->stack, i);
4218 if ((*self->readline_func)(self, &s) < 0) return -1;
4219 if ((*self->readline_func)(self, &s) < 0) return -1;
4220 PDATA_APPEND(self->stack, Py_None,-1);
4221 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004222}
4223
4224static int
Tim Peterscba30e22003-02-01 06:24:36 +00004225noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004226{
4227 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004228
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004229 if ((*self->readline_func)(self, &s) < 0) return -1;
4230 if ((*self->readline_func)(self, &s) < 0) return -1;
4231 PDATA_APPEND(self->stack, Py_None,-1);
4232 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004233}
4234
4235static int
Tim Peterscba30e22003-02-01 06:24:36 +00004236noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004237{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004239 if (self->stack->length < 2) return stackUnderflow();
4240 Pdata_clear(self->stack, self->stack->length-2);
4241 PDATA_APPEND(self->stack, Py_None,-1);
4242 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004243}
4244
4245static int
4246noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004247
Guido van Rossum053b8df1998-11-25 16:18:00 +00004248 if (self->stack->length < 1) return stackUnderflow();
4249 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004250 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004251}
4252
4253
4254static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004255noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004256{
4257 PyObject *err = 0, *val = 0;
4258 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004259
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004260 self->num_marks = 0;
4261 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004263 while (1) {
4264 if ((*self->read_func)(self, &s, 1) < 0)
4265 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004266
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004267 switch (s[0]) {
4268 case NONE:
4269 if (load_none(self) < 0)
4270 break;
4271 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004272
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004273 case BININT:
4274 if (load_binint(self) < 0)
4275 break;
4276 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004278 case BININT1:
4279 if (load_binint1(self) < 0)
4280 break;
4281 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004282
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004283 case BININT2:
4284 if (load_binint2(self) < 0)
4285 break;
4286 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004288 case INT:
4289 if (load_int(self) < 0)
4290 break;
4291 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004292
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004293 case LONG:
4294 if (load_long(self) < 0)
4295 break;
4296 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004297
Tim Peters4190fb82003-02-02 16:09:05 +00004298 case LONG1:
4299 if (load_counted_long(self, 1) < 0)
4300 break;
4301 continue;
4302
4303 case LONG4:
4304 if (load_counted_long(self, 4) < 0)
4305 break;
4306 continue;
4307
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004308 case FLOAT:
4309 if (load_float(self) < 0)
4310 break;
4311 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004312
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004313 case BINFLOAT:
4314 if (load_binfloat(self) < 0)
4315 break;
4316 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004317
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004318 case BINSTRING:
4319 if (load_binstring(self) < 0)
4320 break;
4321 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004322
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004323 case SHORT_BINSTRING:
4324 if (load_short_binstring(self) < 0)
4325 break;
4326 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004327
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004328 case STRING:
4329 if (load_string(self) < 0)
4330 break;
4331 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004332
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004333#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004334 case UNICODE:
4335 if (load_unicode(self) < 0)
4336 break;
4337 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004339 case BINUNICODE:
4340 if (load_binunicode(self) < 0)
4341 break;
4342 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004343#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004344
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004345 case EMPTY_TUPLE:
4346 if (load_empty_tuple(self) < 0)
4347 break;
4348 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004349
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004350 case TUPLE:
4351 if (load_tuple(self) < 0)
4352 break;
4353 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004355 case EMPTY_LIST:
4356 if (load_empty_list(self) < 0)
4357 break;
4358 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004359
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004360 case LIST:
4361 if (load_list(self) < 0)
4362 break;
4363 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004364
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004365 case EMPTY_DICT:
4366 if (load_empty_dict(self) < 0)
4367 break;
4368 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004369
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004370 case DICT:
4371 if (load_dict(self) < 0)
4372 break;
4373 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004374
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004375 case OBJ:
4376 if (noload_obj(self) < 0)
4377 break;
4378 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004379
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004380 case INST:
4381 if (noload_inst(self) < 0)
4382 break;
4383 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004385 case GLOBAL:
4386 if (noload_global(self) < 0)
4387 break;
4388 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004389
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004390 case APPEND:
4391 if (load_append(self) < 0)
4392 break;
4393 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004395 case APPENDS:
4396 if (load_appends(self) < 0)
4397 break;
4398 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004399
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004400 case BUILD:
4401 if (noload_build(self) < 0)
4402 break;
4403 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004405 case DUP:
4406 if (load_dup(self) < 0)
4407 break;
4408 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004409
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004410 case BINGET:
4411 if (load_binget(self) < 0)
4412 break;
4413 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004414
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004415 case LONG_BINGET:
4416 if (load_long_binget(self) < 0)
4417 break;
4418 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004420 case GET:
4421 if (load_get(self) < 0)
4422 break;
4423 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004425 case MARK:
4426 if (load_mark(self) < 0)
4427 break;
4428 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004429
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004430 case BINPUT:
4431 if (load_binput(self) < 0)
4432 break;
4433 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004434
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004435 case LONG_BINPUT:
4436 if (load_long_binput(self) < 0)
4437 break;
4438 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004440 case PUT:
4441 if (load_put(self) < 0)
4442 break;
4443 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004445 case POP:
4446 if (load_pop(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 POP_MARK:
4451 if (load_pop_mark(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 SETITEM:
4456 if (load_setitem(self) < 0)
4457 break;
4458 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004460 case SETITEMS:
4461 if (load_setitems(self) < 0)
4462 break;
4463 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004465 case STOP:
4466 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004467
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004468 case PERSID:
4469 if (load_persid(self) < 0)
4470 break;
4471 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004473 case BINPERSID:
4474 if (load_binpersid(self) < 0)
4475 break;
4476 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004477
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004478 case REDUCE:
4479 if (noload_reduce(self) < 0)
4480 break;
4481 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004482
Tim Peters4190fb82003-02-02 16:09:05 +00004483 case PROTO:
4484 if (load_proto(self) < 0)
4485 break;
4486 continue;
4487
Tim Peters3c67d792003-02-02 17:59:11 +00004488 case NEWTRUE:
4489 if (load_bool(self, Py_True) < 0)
4490 break;
4491 continue;
4492
4493 case NEWFALSE:
4494 if (load_bool(self, Py_False) < 0)
4495 break;
4496 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004497 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004498 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004499 "invalid load key, '%s'.",
4500 "c", s[0]);
4501 return NULL;
4502 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004503
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004504 break;
4505 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004506
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004507 if ((err = PyErr_Occurred())) {
4508 if (err == PyExc_EOFError) {
4509 PyErr_SetNone(PyExc_EOFError);
4510 }
4511 return NULL;
4512 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004513
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004514 PDATA_POP(self->stack, val);
4515 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004516}
Tim Peters84e87f32001-03-17 04:50:51 +00004517
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004518
Guido van Rossum60456fd1997-04-09 17:36:32 +00004519static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004520Unpickler_load(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004521{
Tim Peterscba30e22003-02-01 06:24:36 +00004522 if (!( PyArg_ParseTuple(args, ":load")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004523 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004525 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004526}
4527
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004528static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004529Unpickler_noload(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004530{
Tim Peterscba30e22003-02-01 06:24:36 +00004531 if (!( PyArg_ParseTuple(args, ":noload")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004532 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004534 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004535}
4536
Guido van Rossum60456fd1997-04-09 17:36:32 +00004537
4538static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004539 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004540 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004541 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004542 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004543 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004544 "noload() -- not load a pickle, but go through most of the motions\n"
4545 "\n"
4546 "This function can be used to read past a pickle without instantiating\n"
4547 "any objects or importing any modules. It can also be used to find all\n"
4548 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004549 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004550 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004551 {NULL, NULL} /* sentinel */
4552};
4553
4554
4555static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004556newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004557{
4558 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004559
Tim Peterscba30e22003-02-01 06:24:36 +00004560 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004561 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004562
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004563 self->file = NULL;
4564 self->arg = NULL;
4565 self->stack = (Pdata*)Pdata_New();
4566 self->pers_func = NULL;
4567 self->last_string = NULL;
4568 self->marks = NULL;
4569 self->num_marks = 0;
4570 self->marks_size = 0;
4571 self->buf_size = 0;
4572 self->read = NULL;
4573 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004574 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004575
Tim Peterscba30e22003-02-01 06:24:36 +00004576 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004577 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004579 Py_INCREF(f);
4580 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004581
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004582 /* Set read, readline based on type of f */
4583 if (PyFile_Check(f)) {
4584 self->fp = PyFile_AsFile(f);
4585 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00004586 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004587 "I/O operation on closed file");
4588 goto err;
4589 }
4590 self->read_func = read_file;
4591 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004592 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004593 else if (PycStringIO_InputCheck(f)) {
4594 self->fp = NULL;
4595 self->read_func = read_cStringIO;
4596 self->readline_func = readline_cStringIO;
4597 }
4598 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004599
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004600 self->fp = NULL;
4601 self->read_func = read_other;
4602 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004603
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004604 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4605 (self->read = PyObject_GetAttr(f, read_str)))) {
4606 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00004607 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004608 "argument must have 'read' and "
4609 "'readline' attributes" );
4610 goto err;
4611 }
4612 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004614 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004615
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004616 err:
4617 Py_DECREF((PyObject *)self);
4618 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004619}
4620
4621
4622static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004623get_Unpickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004624{
4625 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004626
Tim Peterscba30e22003-02-01 06:24:36 +00004627 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004628 return NULL;
4629 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004630}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004631
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004632
Guido van Rossum60456fd1997-04-09 17:36:32 +00004633static void
Tim Peterscba30e22003-02-01 06:24:36 +00004634Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004635{
4636 Py_XDECREF(self->readline);
4637 Py_XDECREF(self->read);
4638 Py_XDECREF(self->file);
4639 Py_XDECREF(self->memo);
4640 Py_XDECREF(self->stack);
4641 Py_XDECREF(self->pers_func);
4642 Py_XDECREF(self->arg);
4643 Py_XDECREF(self->last_string);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004644
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004645 if (self->marks) {
4646 free(self->marks);
4647 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004648
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004649 if (self->buf_size) {
4650 free(self->buf);
4651 }
Tim Peters84e87f32001-03-17 04:50:51 +00004652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004653 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004654}
4655
4656
4657static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004658Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004659{
4660 if (!strcmp(name, "persistent_load")) {
4661 if (!self->pers_func) {
4662 PyErr_SetString(PyExc_AttributeError, name);
4663 return NULL;
4664 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004665
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004666 Py_INCREF(self->pers_func);
4667 return self->pers_func;
4668 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004669
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004670 if (!strcmp(name, "find_global")) {
4671 if (!self->find_class) {
4672 PyErr_SetString(PyExc_AttributeError, name);
4673 return NULL;
4674 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004675
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004676 Py_INCREF(self->find_class);
4677 return self->find_class;
4678 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004680 if (!strcmp(name, "memo")) {
4681 if (!self->memo) {
4682 PyErr_SetString(PyExc_AttributeError, name);
4683 return NULL;
4684 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004685
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004686 Py_INCREF(self->memo);
4687 return self->memo;
4688 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004690 if (!strcmp(name, "UnpicklingError")) {
4691 Py_INCREF(UnpicklingError);
4692 return UnpicklingError;
4693 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004695 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004696}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004697
Guido van Rossum60456fd1997-04-09 17:36:32 +00004698
4699static int
Tim Peterscba30e22003-02-01 06:24:36 +00004700Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004701{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004703 if (!strcmp(name, "persistent_load")) {
4704 Py_XDECREF(self->pers_func);
4705 self->pers_func = value;
4706 Py_XINCREF(value);
4707 return 0;
4708 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004710 if (!strcmp(name, "find_global")) {
4711 Py_XDECREF(self->find_class);
4712 self->find_class = value;
4713 Py_XINCREF(value);
4714 return 0;
4715 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004716
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004717 if (! value) {
4718 PyErr_SetString(PyExc_TypeError,
4719 "attribute deletion is not supported");
4720 return -1;
4721 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004722
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004723 if (strcmp(name, "memo") == 0) {
4724 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00004725 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004726 "memo must be a dictionary");
4727 return -1;
4728 }
4729 Py_XDECREF(self->memo);
4730 self->memo = value;
4731 Py_INCREF(value);
4732 return 0;
4733 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004734
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004735 PyErr_SetString(PyExc_AttributeError, name);
4736 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004737}
4738
Tim Peters5bd2a792003-02-01 16:45:06 +00004739/* ---------------------------------------------------------------------------
4740 * Module-level functions.
4741 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004742
Tim Peters5bd2a792003-02-01 16:45:06 +00004743/* dump(obj, file, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004744static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004745cpm_dump(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004746{
4747 PyObject *ob, *file, *res = NULL;
4748 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00004749 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004750
Tim Peters5bd2a792003-02-01 16:45:06 +00004751 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004752 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004753
Tim Peters5bd2a792003-02-01 16:45:06 +00004754 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004755 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004757 if (dump(pickler, ob) < 0)
4758 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004760 Py_INCREF(Py_None);
4761 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004763 finally:
4764 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004765
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004766 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004767}
4768
4769
Tim Peters5bd2a792003-02-01 16:45:06 +00004770/* dumps(obj, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004771static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004772cpm_dumps(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004773{
4774 PyObject *ob, *file = 0, *res = NULL;
4775 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00004776 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004777
Tim Peters5bd2a792003-02-01 16:45:06 +00004778 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004779 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004780
Tim Peterscba30e22003-02-01 06:24:36 +00004781 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004782 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004783
Tim Peters5bd2a792003-02-01 16:45:06 +00004784 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004785 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004787 if (dump(pickler, ob) < 0)
4788 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004789
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004790 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004792 finally:
4793 Py_XDECREF(pickler);
4794 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004796 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004797}
4798
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004799
Tim Peters5bd2a792003-02-01 16:45:06 +00004800/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004801static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004802cpm_load(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004803{
4804 Unpicklerobject *unpickler = 0;
4805 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004806
Tim Peterscba30e22003-02-01 06:24:36 +00004807 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004808 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004809
Tim Peterscba30e22003-02-01 06:24:36 +00004810 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004811 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004813 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004815 finally:
4816 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004818 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004819}
4820
4821
Tim Peters5bd2a792003-02-01 16:45:06 +00004822/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004823static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004824cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004825{
4826 PyObject *ob, *file = 0, *res = NULL;
4827 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004828
Tim Peterscba30e22003-02-01 06:24:36 +00004829 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004830 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004831
Tim Peterscba30e22003-02-01 06:24:36 +00004832 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004833 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004834
Tim Peterscba30e22003-02-01 06:24:36 +00004835 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004836 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004837
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004838 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004840 finally:
4841 Py_XDECREF(file);
4842 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004844 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004845}
4846
4847
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004848PyDoc_STRVAR(Unpicklertype__doc__,
4849"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004850
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004851static PyTypeObject Unpicklertype = {
4852 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004853 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004854 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004855 sizeof(Unpicklerobject), /*tp_basicsize*/
4856 0, /*tp_itemsize*/
4857 /* methods */
4858 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4859 (printfunc)0, /*tp_print*/
4860 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4861 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4862 (cmpfunc)0, /*tp_compare*/
4863 (reprfunc)0, /*tp_repr*/
4864 0, /*tp_as_number*/
4865 0, /*tp_as_sequence*/
4866 0, /*tp_as_mapping*/
4867 (hashfunc)0, /*tp_hash*/
4868 (ternaryfunc)0, /*tp_call*/
4869 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004870
Guido van Rossum60456fd1997-04-09 17:36:32 +00004871 /* Space for future expansion */
4872 0L,0L,0L,0L,
4873 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004874};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004875
Guido van Rossum60456fd1997-04-09 17:36:32 +00004876static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004877 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004878 PyDoc_STR("dump(object, file, proto=0) -- "
4879 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004880 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00004881 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004882 },
Tim Peters5bd2a792003-02-01 16:45:06 +00004883
Neal Norwitzb0493252002-03-31 14:44:22 +00004884 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004885 PyDoc_STR("dumps(object, proto=0) -- "
4886 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004887 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00004888 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004889 },
Tim Peters5bd2a792003-02-01 16:45:06 +00004890
Neal Norwitzb0493252002-03-31 14:44:22 +00004891 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004892 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00004893
Neal Norwitzb0493252002-03-31 14:44:22 +00004894 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004895 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00004896
Neal Norwitzb0493252002-03-31 14:44:22 +00004897 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004898 PyDoc_STR("Pickler(file, proto=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004899 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00004900 "This takes a file-like object for writing a pickle data stream.\n"
4901 "The optional proto argument tells the pickler to use the given\n"
4902 "protocol; supported protocols are 0, 1, 2. The default\n"
4903 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
4904 "only protocol that can be written to a file opened in text\n"
4905 "mode and read back successfully. When using a protocol higher\n"
4906 "than 0, make sure the file is opened in binary mode, both when\n"
4907 "pickling and unpickling.)\n"
4908 "\n"
4909 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
4910 "more efficient than protocol 1.\n"
4911 "\n"
4912 "Specifying a negative protocol version selects the highest\n"
4913 "protocol version supported. The higher the protocol used, the\n"
4914 "more recent the version of Python needed to read the pickle\n"
4915 "produced.\n"
4916 "\n"
4917 "The file parameter must have a write() method that accepts a single\n"
4918 "string argument. It can thus be an open file object, a StringIO\n"
4919 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004920 },
Tim Peters5bd2a792003-02-01 16:45:06 +00004921
Neal Norwitzb0493252002-03-31 14:44:22 +00004922 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004923 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
4924
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004925 { NULL, NULL }
4926};
4927
Guido van Rossum60456fd1997-04-09 17:36:32 +00004928static int
Tim Peterscba30e22003-02-01 06:24:36 +00004929init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004930{
4931 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004932
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00004933#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004935 INIT_STR(__class__);
4936 INIT_STR(__getinitargs__);
4937 INIT_STR(__dict__);
4938 INIT_STR(__getstate__);
4939 INIT_STR(__setstate__);
4940 INIT_STR(__name__);
4941 INIT_STR(__main__);
4942 INIT_STR(__reduce__);
4943 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004944 INIT_STR(append);
4945 INIT_STR(read);
4946 INIT_STR(readline);
4947 INIT_STR(copy_reg);
4948 INIT_STR(dispatch_table);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004949 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004950
Tim Peterscba30e22003-02-01 06:24:36 +00004951 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004952 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004953
Tim Peters1f1b2d22003-02-01 02:16:37 +00004954 /* This is special because we want to use a different
4955 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004956 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peterscba30e22003-02-01 06:24:36 +00004957 if (!dispatch_table)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004958 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004959
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004960 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004961
Tim Peterscba30e22003-02-01 06:24:36 +00004962 if (!( empty_tuple = PyTuple_New(0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004963 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004964
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004965 /* Ugh */
4966 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
4967 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4968 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004969
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004970 if (!( t=PyDict_New())) return -1;
4971 if (!( r=PyRun_String(
4972 "def __init__(self, *args): self.args=args\n\n"
4973 "def __str__(self):\n"
4974 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4975 Py_file_input,
4976 module_dict, t) )) return -1;
4977 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004978
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004979 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00004980 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004981 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004983 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004984
Tim Peterscba30e22003-02-01 06:24:36 +00004985 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004986 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00004987 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004988 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004989
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004990 if (!( t=PyDict_New())) return -1;
4991 if (!( r=PyRun_String(
4992 "def __init__(self, *args): self.args=args\n\n"
4993 "def __str__(self):\n"
4994 " a=self.args\n"
4995 " a=a and type(a[0]) or '(what)'\n"
4996 " return 'Cannot pickle %s objects' % a\n"
4997 , Py_file_input,
4998 module_dict, t) )) return -1;
4999 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005001 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005002 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005003 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005004
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005005 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005006
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005007 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005008 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005009 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005010
Martin v. Löwis658009a2002-09-16 17:26:24 +00005011 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5012 UnpicklingError, NULL)))
5013 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005014
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005015 if (PyDict_SetItemString(module_dict, "PickleError",
5016 PickleError) < 0)
5017 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005018
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005019 if (PyDict_SetItemString(module_dict, "PicklingError",
5020 PicklingError) < 0)
5021 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005023 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5024 UnpicklingError) < 0)
5025 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005026
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005027 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5028 UnpickleableError) < 0)
5029 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005031 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5032 BadPickleGet) < 0)
5033 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005034
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005035 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005036
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005037 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005038}
5039
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005040#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5041#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005042#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005043PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005044initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005045{
5046 PyObject *m, *d, *di, *v, *k;
5047 int i;
5048 char *rev="1.71";
5049 PyObject *format_version;
5050 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005051
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005052 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005053 Unpicklertype.ob_type = &PyType_Type;
5054 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005055
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005056 /* Initialize some pieces. We need to do this before module creation,
5057 so we're forced to use a temporary dictionary. :(
5058 */
5059 di=PyDict_New();
5060 if (!di) return;
5061 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005062
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005063 /* Create the module and add the functions */
5064 m = Py_InitModule4("cPickle", cPickle_methods,
5065 cPickle_module_documentation,
5066 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005067
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005068 /* Add some symbolic constants to the module */
5069 d = PyModule_GetDict(m);
5070 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
5071 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005073 /* Copy data from di. Waaa. */
5074 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5075 if (PyObject_SetItem(d, k, v) < 0) {
5076 Py_DECREF(di);
5077 return;
5078 }
5079 }
5080 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005082 format_version = PyString_FromString("1.3");
5083 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005085 PyDict_SetItemString(d, "format_version", format_version);
5086 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5087 Py_XDECREF(format_version);
5088 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005089}