blob: 43a8d331029a0bcf1d1d1461bb676374f58d6a37 [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 Peterscba30e22003-02-01 06:24:36 +0000722 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000723
Tim Peterscba30e22003-02-01 06:24:36 +0000724 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000725 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000726
Tim Peterscba30e22003-02-01 06:24:36 +0000727 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000728 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000729
Tim Peterscba30e22003-02-01 06:24:36 +0000730 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000731 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000732
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000733 PyTuple_SET_ITEM(t, 0, memo_len);
734 Py_INCREF(memo_len);
735 PyTuple_SET_ITEM(t, 1, ob);
736 Py_INCREF(ob);
737
738 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
739 goto finally;
740
741 if (!self->bin) {
742 c_str[0] = PUT;
743 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
744 len = strlen(c_str);
745 }
746 else if (Pdata_Check(self->file)) {
747 if (write_other(self, NULL, 0) < 0) return -1;
748 PDATA_APPEND(self->file, memo_len, -1);
749 res=0; /* Job well done ;) */
750 goto finally;
751 }
752 else {
753 if (p >= 256) {
754 c_str[0] = LONG_BINPUT;
755 c_str[1] = (int)(p & 0xff);
756 c_str[2] = (int)((p >> 8) & 0xff);
757 c_str[3] = (int)((p >> 16) & 0xff);
758 c_str[4] = (int)((p >> 24) & 0xff);
759 len = 5;
760 }
761 else {
762 c_str[0] = BINPUT;
763 c_str[1] = p;
764 len = 2;
765 }
766 }
767
768 if ((*self->write_func)(self, c_str, len) < 0)
769 goto finally;
770
771 res = 0;
772
773 finally:
774 Py_XDECREF(py_ob_id);
775 Py_XDECREF(memo_len);
776 Py_XDECREF(t);
777
778 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000779}
780
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000781#define PyImport_Import cPickle_Import
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000782
783static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000784PyImport_Import(PyObject *module_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000785{
786 static PyObject *silly_list=0, *__builtins___str=0, *__import___str;
787 static PyObject *standard_builtins=0;
788 PyObject *globals=0, *__import__=0, *__builtins__=0, *r=0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000789
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000790 if (!( silly_list )) {
Tim Peterscba30e22003-02-01 06:24:36 +0000791 if (!( __import___str=PyString_FromString("__import__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000792 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000793 if (!( __builtins___str=PyString_FromString("__builtins__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000794 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000795 if (!( silly_list=Py_BuildValue("[s]","__doc__")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000796 return NULL;
797 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000799 if ((globals=PyEval_GetGlobals())) {
800 Py_INCREF(globals);
801 __builtins__=PyObject_GetItem(globals,__builtins___str);
Tim Peterscba30e22003-02-01 06:24:36 +0000802 if (!__builtins__)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000803 goto err;
804 }
805 else {
806 PyErr_Clear();
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000808 if (!(standard_builtins ||
Tim Peterscba30e22003-02-01 06:24:36 +0000809 (standard_builtins=PyImport_ImportModule("__builtin__"))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000810 return NULL;
Tim Peters84e87f32001-03-17 04:50:51 +0000811
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000812 __builtins__=standard_builtins;
813 Py_INCREF(__builtins__);
814 globals = Py_BuildValue("{sO}", "__builtins__", __builtins__);
Tim Peterscba30e22003-02-01 06:24:36 +0000815 if (!globals)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000816 goto err;
817 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000819 if (PyDict_Check(__builtins__)) {
820 __import__=PyObject_GetItem(__builtins__,__import___str);
821 if (!__import__) goto err;
822 }
823 else {
824 __import__=PyObject_GetAttr(__builtins__,__import___str);
825 if (!__import__) goto err;
826 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000828 r=PyObject_CallFunction(__import__,"OOOO",
829 module_name, globals, globals, silly_list);
Tim Peterscba30e22003-02-01 06:24:36 +0000830 if (!r)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000831 goto err;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000833 Py_DECREF(globals);
834 Py_DECREF(__builtins__);
835 Py_DECREF(__import__);
Tim Peters84e87f32001-03-17 04:50:51 +0000836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000837 return r;
838 err:
839 Py_XDECREF(globals);
840 Py_XDECREF(__builtins__);
841 Py_XDECREF(__import__);
842 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000843}
844
845static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000846whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000847{
848 int i, j;
849 PyObject *module = 0, *modules_dict = 0,
850 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000852 module = PyObject_GetAttrString(global, "__module__");
853 if (module) return module;
854 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000855
Tim Peterscba30e22003-02-01 06:24:36 +0000856 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000857 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000859 i = 0;
860 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000862 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000864 global_name_attr = PyObject_GetAttr(module, global_name);
865 if (!global_name_attr) {
866 PyErr_Clear();
867 continue;
868 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000870 if (global_name_attr != global) {
871 Py_DECREF(global_name_attr);
872 continue;
873 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000874
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000875 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000877 break;
878 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000880 /* The following implements the rule in pickle.py added in 1.5
881 that used __main__ if no module is found. I don't actually
882 like this rule. jlf
883 */
884 if (!j) {
885 j=1;
886 name=__main___str;
887 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000888
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000889 Py_INCREF(name);
890 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000891}
892
893
Guido van Rossum60456fd1997-04-09 17:36:32 +0000894static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000895fast_save_enter(Picklerobject *self, PyObject *obj)
896{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000897 /* if fast_container < 0, we're doing an error exit. */
898 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
899 PyObject *key = NULL;
900 if (self->fast_memo == NULL) {
901 self->fast_memo = PyDict_New();
902 if (self->fast_memo == NULL) {
903 self->fast_container = -1;
904 return 0;
905 }
906 }
907 key = PyLong_FromVoidPtr(obj);
908 if (key == NULL)
909 return 0;
910 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000911 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000912 PyErr_Format(PyExc_ValueError,
913 "fast mode: can't pickle cyclic objects including object type %s at %p",
914 obj->ob_type->tp_name, obj);
915 self->fast_container = -1;
916 return 0;
917 }
918 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000919 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000920 self->fast_container = -1;
921 return 0;
922 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000923 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000924 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000925 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000926}
927
Tim Peterscba30e22003-02-01 06:24:36 +0000928int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000929fast_save_leave(Picklerobject *self, PyObject *obj)
930{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000931 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
932 PyObject *key = PyLong_FromVoidPtr(obj);
933 if (key == NULL)
934 return 0;
935 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000936 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000937 return 0;
938 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000939 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000940 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000941 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000942}
943
944static int
Tim Peterscba30e22003-02-01 06:24:36 +0000945save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000946{
947 static char none = NONE;
948 if ((*self->write_func)(self, &none, 1) < 0)
949 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000950
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000951 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000952}
953
Guido van Rossum77f6a652002-04-03 22:41:51 +0000954static int
Tim Peterscba30e22003-02-01 06:24:36 +0000955save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000956{
Guido van Rossume2763392002-04-05 19:30:08 +0000957 static char *buf[2] = {FALSE, TRUE};
958 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000959 long l = PyInt_AS_LONG((PyIntObject *)args);
960
Guido van Rossume2763392002-04-05 19:30:08 +0000961 if ((*self->write_func)(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000962 return -1;
963
964 return 0;
965}
Tim Peters84e87f32001-03-17 04:50:51 +0000966
Guido van Rossum60456fd1997-04-09 17:36:32 +0000967static int
Tim Peterscba30e22003-02-01 06:24:36 +0000968save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000969{
970 char c_str[32];
971 long l = PyInt_AS_LONG((PyIntObject *)args);
972 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000973
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000974 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000975#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000976 || l > 0x7fffffffL
977 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000978#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000979 ) {
980 /* Text-mode pickle, or long too big to fit in the 4-byte
981 * signed BININT format: store as a string.
982 */
983 c_str[0] = INT;
984 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
985 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
986 return -1;
987 }
988 else {
989 /* Binary pickle and l fits in a signed 4-byte int. */
990 c_str[1] = (int)( l & 0xff);
991 c_str[2] = (int)((l >> 8) & 0xff);
992 c_str[3] = (int)((l >> 16) & 0xff);
993 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000994
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000995 if ((c_str[4] == 0) && (c_str[3] == 0)) {
996 if (c_str[2] == 0) {
997 c_str[0] = BININT1;
998 len = 2;
999 }
1000 else {
1001 c_str[0] = BININT2;
1002 len = 3;
1003 }
1004 }
1005 else {
1006 c_str[0] = BININT;
1007 len = 5;
1008 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001009
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001010 if ((*self->write_func)(self, c_str, len) < 0)
1011 return -1;
1012 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001014 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001015}
1016
1017
1018static int
Tim Peterscba30e22003-02-01 06:24:36 +00001019save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001020{
Tim Petersee1a53c2003-02-02 02:57:53 +00001021 int size;
1022 int res = -1;
1023 PyObject *repr = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001024
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001025 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001026
Tim Petersee1a53c2003-02-02 02:57:53 +00001027 if (self->proto >= 2) {
1028 /* Linear-time pickling. */
1029 size_t nbits;
1030 size_t nbytes;
1031 unsigned char *pdata;
1032 char c_str[5];
1033 int i;
1034 int sign = _PyLong_Sign(args);
1035
1036 if (sign == 0) {
1037 /* It's 0 -- an empty bytestring. */
1038 c_str[0] = LONG1;
1039 c_str[1] = 0;
1040 i = self->write_func(self, c_str, 2);
1041 if (i < 0) goto finally;
1042 res = 0;
1043 goto finally;
1044 }
1045 nbits = _PyLong_NumBits(args);
1046 if (nbits == (size_t)-1 && PyErr_Occurred())
1047 goto finally;
1048 /* How many bytes do we need? There are nbits >> 3 full
1049 * bytes of data, and nbits & 7 leftover bits. If there
1050 * are any leftover bits, then we clearly need another
1051 * byte. Wnat's not so obvious is that we *probably*
1052 * need another byte even if there aren't any leftovers:
1053 * the most-significant bit of the most-significant byte
1054 * acts like a sign bit, and it's usually got a sense
1055 * opposite of the one we need. The exception is longs
1056 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1057 * its own 256's-complement, so has the right sign bit
1058 * even without the extra byte. That's a pain to check
1059 * for in advance, though, so we always grab an extra
1060 * byte at the start, and cut it back later if possible.
1061 */
1062 nbytes = (nbits >> 3) + 1;
1063 if ((int)nbytes < 0 || (size_t)(int)nbytes != nbytes) {
1064 PyErr_SetString(PyExc_OverflowError, "long too large "
1065 "to pickle");
1066 goto finally;
1067 }
1068 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
1069 if (repr == NULL) goto finally;
1070 pdata = (unsigned char *)PyString_AS_STRING(repr);
1071 i = _PyLong_AsByteArray((PyLongObject *)args,
1072 pdata, nbytes,
1073 1 /* little endian */, 1 /* signed */);
1074 if (i < 0) goto finally;
1075 /* If the long is negative, this may be a byte more than
1076 * needed. This is so iff the MSB is all redundant sign
1077 * bits.
1078 */
1079 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1080 (pdata[nbytes - 2] & 0x80) != 0)
1081 --nbytes;
1082
1083 if (nbytes < 256) {
1084 c_str[0] = LONG1;
1085 c_str[1] = (char)nbytes;
1086 size = 2;
1087 }
1088 else {
1089 c_str[0] = LONG4;
1090 size = (int)nbytes;
1091 for (i = 1; i < 5; i++) {
1092 c_str[i] = (char)(size & 0xff);
1093 size >>= 8;
1094 }
1095 size = 5;
1096 }
1097 i = self->write_func(self, c_str, size);
1098 if (i < 0) goto finally;
1099 i = self->write_func(self, (char *)pdata, (int)nbytes);
1100 if (i < 0) goto finally;
1101 res = 0;
1102 goto finally;
1103 }
1104
1105 /* proto < 2: write the repr and newline. This is quadratic-time
1106 * (in the number of digits), in both directions.
1107 */
Tim Peterscba30e22003-02-01 06:24:36 +00001108 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001109 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001111 if ((size = PyString_Size(repr)) < 0)
1112 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001114 if ((*self->write_func)(self, &l, 1) < 0)
1115 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001117 if ((*self->write_func)(self,
Tim Peterscba30e22003-02-01 06:24:36 +00001118 PyString_AS_STRING((PyStringObject *)repr),
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001119 size) < 0)
1120 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001122 if ((*self->write_func)(self, "\n", 1) < 0)
1123 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001125 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001127 finally:
1128 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001129 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001130}
1131
1132
1133static int
Tim Peterscba30e22003-02-01 06:24:36 +00001134save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001135{
1136 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001138 if (self->bin) {
1139 int s, e;
1140 double f;
1141 long fhi, flo;
1142 char str[9];
1143 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001144
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001145 *p = BINFLOAT;
1146 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001148 if (x < 0) {
1149 s = 1;
1150 x = -x;
1151 }
1152 else
1153 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001155 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001157 /* Normalize f to be in the range [1.0, 2.0) */
1158 if (0.5 <= f && f < 1.0) {
1159 f *= 2.0;
1160 e--;
1161 }
1162 else if (f == 0.0) {
1163 e = 0;
1164 }
1165 else {
1166 PyErr_SetString(PyExc_SystemError,
1167 "frexp() result out of range");
1168 return -1;
1169 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001170
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001171 if (e >= 1024) {
1172 /* XXX 1024 itself is reserved for Inf/NaN */
1173 PyErr_SetString(PyExc_OverflowError,
1174 "float too large to pack with d format");
1175 return -1;
1176 }
1177 else if (e < -1022) {
1178 /* Gradual underflow */
1179 f = ldexp(f, 1022 + e);
1180 e = 0;
1181 }
1182 else if (!(e == 0 && f == 0.0)) {
1183 e += 1023;
1184 f -= 1.0; /* Get rid of leading 1 */
1185 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001186
Tim Peterscba30e22003-02-01 06:24:36 +00001187 /* fhi receives the high 28 bits;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001188 flo the low 24 bits (== 52 bits) */
1189 f *= 268435456.0; /* 2**28 */
1190 fhi = (long) floor(f); /* Truncate */
1191 f -= (double)fhi;
1192 f *= 16777216.0; /* 2**24 */
1193 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001195 /* First byte */
1196 *p = (s<<7) | (e>>4);
1197 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001198
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001199 /* Second byte */
1200 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1201 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001203 /* Third byte */
1204 *p = (unsigned char) ((fhi>>16) & 0xFF);
1205 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001206
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001207 /* Fourth byte */
1208 *p = (unsigned char) ((fhi>>8) & 0xFF);
1209 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001211 /* Fifth byte */
1212 *p = (unsigned char) (fhi & 0xFF);
1213 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001215 /* Sixth byte */
1216 *p = (unsigned char) ((flo>>16) & 0xFF);
1217 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001218
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001219 /* Seventh byte */
1220 *p = (unsigned char) ((flo>>8) & 0xFF);
1221 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001222
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001223 /* Eighth byte */
1224 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001226 if ((*self->write_func)(self, str, 9) < 0)
1227 return -1;
1228 }
1229 else {
1230 char c_str[250];
1231 c_str[0] = FLOAT;
1232 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001234 if ((*self->write_func)(self, c_str, strlen(c_str)) < 0)
1235 return -1;
1236 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001237
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001238 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001239}
1240
1241
1242static int
Tim Peterscba30e22003-02-01 06:24:36 +00001243save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001244{
1245 int size, len;
1246 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001247
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001248 if ((size = PyString_Size(args)) < 0)
1249 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001250
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001251 if (!self->bin) {
1252 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001253
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001254 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001255
Tim Peterscba30e22003-02-01 06:24:36 +00001256 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001257 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001259 if ((len = PyString_Size(repr)) < 0)
1260 goto err;
1261 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001263 if ((*self->write_func)(self, &string, 1) < 0)
1264 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001265
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001266 if ((*self->write_func)(self, repr_str, len) < 0)
1267 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001268
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001269 if ((*self->write_func)(self, "\n", 1) < 0)
1270 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001272 Py_XDECREF(repr);
1273 }
1274 else {
1275 int i;
1276 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001278 if ((size = PyString_Size(args)) < 0)
1279 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001281 if (size < 256) {
1282 c_str[0] = SHORT_BINSTRING;
1283 c_str[1] = size;
1284 len = 2;
1285 }
1286 else {
1287 c_str[0] = BINSTRING;
1288 for (i = 1; i < 5; i++)
1289 c_str[i] = (int)(size >> ((i - 1) * 8));
1290 len = 5;
1291 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001292
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001293 if ((*self->write_func)(self, c_str, len) < 0)
1294 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001295
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001296 if (size > 128 && Pdata_Check(self->file)) {
1297 if (write_other(self, NULL, 0) < 0) return -1;
1298 PDATA_APPEND(self->file, args, -1);
1299 }
1300 else {
1301 if ((*self->write_func)(self,
1302 PyString_AS_STRING((PyStringObject *)args), size) < 0)
1303 return -1;
1304 }
1305 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001306
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001307 if (doput)
1308 if (put(self, args) < 0)
1309 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001311 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001312
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001313 err:
1314 Py_XDECREF(repr);
1315 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001316}
1317
1318
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001319#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001320/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1321 backslash and newline characters to \uXXXX escapes. */
1322static PyObject *
1323modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1324{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001325 PyObject *repr;
1326 char *p;
1327 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001328
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001329 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001331 repr = PyString_FromStringAndSize(NULL, 6 * size);
1332 if (repr == NULL)
1333 return NULL;
1334 if (size == 0)
1335 return repr;
1336
1337 p = q = PyString_AS_STRING(repr);
1338 while (size-- > 0) {
1339 Py_UNICODE ch = *s++;
1340 /* Map 16-bit characters to '\uxxxx' */
1341 if (ch >= 256 || ch == '\\' || ch == '\n') {
1342 *p++ = '\\';
1343 *p++ = 'u';
1344 *p++ = hexdigit[(ch >> 12) & 0xf];
1345 *p++ = hexdigit[(ch >> 8) & 0xf];
1346 *p++ = hexdigit[(ch >> 4) & 0xf];
1347 *p++ = hexdigit[ch & 15];
1348 }
1349 /* Copy everything else as-is */
1350 else
1351 *p++ = (char) ch;
1352 }
1353 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001354 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001355 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001356}
1357
1358
Guido van Rossum60456fd1997-04-09 17:36:32 +00001359static int
Tim Peterscba30e22003-02-01 06:24:36 +00001360save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001361{
1362 int size, len;
1363 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001364
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001365 if (!PyUnicode_Check(args))
1366 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001367
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001368 if (!self->bin) {
1369 char *repr_str;
1370 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001372 repr = modified_EncodeRawUnicodeEscape(
1373 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001374 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001375 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001377 if ((len = PyString_Size(repr)) < 0)
1378 goto err;
1379 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001381 if ((*self->write_func)(self, &string, 1) < 0)
1382 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001383
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001384 if ((*self->write_func)(self, repr_str, len) < 0)
1385 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001387 if ((*self->write_func)(self, "\n", 1) < 0)
1388 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001389
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001390 Py_XDECREF(repr);
1391 }
1392 else {
1393 int i;
1394 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001395
Tim Peterscba30e22003-02-01 06:24:36 +00001396 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001397 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001399 if ((size = PyString_Size(repr)) < 0)
1400 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001402 c_str[0] = BINUNICODE;
1403 for (i = 1; i < 5; i++)
1404 c_str[i] = (int)(size >> ((i - 1) * 8));
1405 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001407 if ((*self->write_func)(self, c_str, len) < 0)
1408 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001409
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001410 if (size > 128 && Pdata_Check(self->file)) {
1411 if (write_other(self, NULL, 0) < 0)
1412 goto err;
1413 PDATA_APPEND(self->file, repr, -1);
1414 }
1415 else {
1416 if ((*self->write_func)(self, PyString_AS_STRING(repr),
1417 size) < 0)
1418 goto err;
1419 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001421 Py_DECREF(repr);
1422 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001424 if (doput)
1425 if (put(self, args) < 0)
1426 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001427
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001428 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001429
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001430 err:
1431 Py_XDECREF(repr);
1432 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001433}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001434#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001435
1436
1437static int
Tim Peterscba30e22003-02-01 06:24:36 +00001438save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001439{
1440 PyObject *element = 0, *py_tuple_id = 0;
1441 int len, i, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001443 static char tuple = TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001445 if ((*self->write_func)(self, &MARKv, 1) < 0)
1446 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001448 if ((len = PyTuple_Size(args)) < 0)
1449 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001450
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001451 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001452 if (!( element = PyTuple_GET_ITEM((PyTupleObject *)args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001453 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001454
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001455 if (save(self, element, 0) < 0)
1456 goto finally;
1457 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001458
Tim Peterscba30e22003-02-01 06:24:36 +00001459 if (!( py_tuple_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001460 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001461
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001462 if (len) {
1463 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1464 if (self->bin) {
1465 static char pop_mark = POP_MARK;
Tim Peters84e87f32001-03-17 04:50:51 +00001466
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001467 if ((*self->write_func)(self, &pop_mark, 1) < 0)
1468 goto finally;
1469 }
1470 else {
1471 static char pop = POP;
Tim Peters84e87f32001-03-17 04:50:51 +00001472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001473 for (i = 0; i <= len; i++) {
1474 if ((*self->write_func)(self, &pop, 1) < 0)
1475 goto finally;
1476 }
1477 }
Tim Peters84e87f32001-03-17 04:50:51 +00001478
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001479 if (get(self, py_tuple_id) < 0)
1480 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001481
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001482 res = 0;
1483 goto finally;
1484 }
1485 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001487 if ((*self->write_func)(self, &tuple, 1) < 0) {
1488 goto finally;
1489 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001491 if (put(self, args) < 0)
1492 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001493
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001494 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001496 finally:
1497 Py_XDECREF(py_tuple_id);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001499 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001500}
1501
1502static int
Tim Peterscba30e22003-02-01 06:24:36 +00001503save_empty_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001504{
1505 static char tuple = EMPTY_TUPLE;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001506
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001507 return (*self->write_func)(self, &tuple, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001508}
1509
1510
1511static int
Tim Peterscba30e22003-02-01 06:24:36 +00001512save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001513{
1514 PyObject *element = 0;
1515 int s_len, len, i, using_appends, res = -1;
1516 char s[3];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001517
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001518 static char append = APPEND, appends = APPENDS;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001519
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001520 if (self->fast && !fast_save_enter(self, args))
1521 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001523 if (self->bin) {
1524 s[0] = EMPTY_LIST;
1525 s_len = 1;
1526 }
1527 else {
1528 s[0] = MARK;
1529 s[1] = LIST;
1530 s_len = 2;
1531 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001533 if ((len = PyList_Size(args)) < 0)
1534 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001536 if ((*self->write_func)(self, s, s_len) < 0)
1537 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001538
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001539 if (len == 0) {
1540 if (put(self, args) < 0)
1541 goto finally;
1542 }
1543 else {
1544 if (put2(self, args) < 0)
1545 goto finally;
1546 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001548 if ((using_appends = (self->bin && (len > 1))))
1549 if ((*self->write_func)(self, &MARKv, 1) < 0)
1550 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001552 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001553 if (!( element = PyList_GET_ITEM((PyListObject *)args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001554 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001556 if (save(self, element, 0) < 0)
1557 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001558
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001559 if (!using_appends) {
1560 if ((*self->write_func)(self, &append, 1) < 0)
1561 goto finally;
1562 }
1563 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001564
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001565 if (using_appends) {
1566 if ((*self->write_func)(self, &appends, 1) < 0)
1567 goto finally;
1568 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001569
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001570 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001571
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001572 finally:
1573 if (self->fast && !fast_save_leave(self, args))
1574 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001576 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001577}
1578
1579
Guido van Rossum60456fd1997-04-09 17:36:32 +00001580static int
Tim Peterscba30e22003-02-01 06:24:36 +00001581save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001582{
1583 PyObject *key = 0, *value = 0;
1584 int i, len, res = -1, using_setitems;
1585 char s[3];
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001586
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001587 static char setitem = SETITEM, setitems = SETITEMS;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001589 if (self->fast && !fast_save_enter(self, args))
1590 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001592 if (self->bin) {
1593 s[0] = EMPTY_DICT;
1594 len = 1;
1595 }
1596 else {
1597 s[0] = MARK;
1598 s[1] = DICT;
1599 len = 2;
1600 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001602 if ((*self->write_func)(self, s, len) < 0)
1603 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001604
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001605 if ((len = PyDict_Size(args)) < 0)
1606 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001608 if (len == 0) {
1609 if (put(self, args) < 0)
1610 goto finally;
1611 }
1612 else {
1613 if (put2(self, args) < 0)
1614 goto finally;
1615 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001617 if ((using_setitems = (self->bin && (PyDict_Size(args) > 1))))
1618 if ((*self->write_func)(self, &MARKv, 1) < 0)
1619 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001621 i = 0;
1622 while (PyDict_Next(args, &i, &key, &value)) {
1623 if (save(self, key, 0) < 0)
1624 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001625
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001626 if (save(self, value, 0) < 0)
1627 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001628
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001629 if (!using_setitems) {
1630 if ((*self->write_func)(self, &setitem, 1) < 0)
1631 goto finally;
1632 }
1633 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001634
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001635 if (using_setitems) {
1636 if ((*self->write_func)(self, &setitems, 1) < 0)
1637 goto finally;
1638 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001639
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001640 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001641
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001642 finally:
1643 if (self->fast && !fast_save_leave(self, args))
1644 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001645
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001646 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001647}
1648
1649
Tim Peters84e87f32001-03-17 04:50:51 +00001650static int
Tim Peterscba30e22003-02-01 06:24:36 +00001651save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001652{
1653 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1654 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1655 char *module_str, *name_str;
1656 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001657
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001658 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001659
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001660 if (self->fast && !fast_save_enter(self, args))
1661 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001662
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001663 if ((*self->write_func)(self, &MARKv, 1) < 0)
1664 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001665
Tim Peterscba30e22003-02-01 06:24:36 +00001666 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001667 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001669 if (self->bin) {
1670 if (save(self, class, 0) < 0)
1671 goto finally;
1672 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001673
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001674 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1675 PyObject *element = 0;
1676 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001677
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001678 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00001679 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001680 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001681
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001682 if ((len = PyObject_Size(class_args)) < 0)
1683 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001685 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001686 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001687 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001689 if (save(self, element, 0) < 0) {
1690 Py_DECREF(element);
1691 goto finally;
1692 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001694 Py_DECREF(element);
1695 }
1696 }
1697 else {
1698 PyErr_Clear();
1699 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001700
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001701 if (!self->bin) {
1702 if (!( name = ((PyClassObject *)class)->cl_name )) {
1703 PyErr_SetString(PicklingError, "class has no name");
1704 goto finally;
1705 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001706
Tim Peterscba30e22003-02-01 06:24:36 +00001707 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001708 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001709
Tim Peters84e87f32001-03-17 04:50:51 +00001710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001711 if ((module_size = PyString_Size(module)) < 0 ||
1712 (name_size = PyString_Size(name)) < 0)
1713 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001715 module_str = PyString_AS_STRING((PyStringObject *)module);
1716 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001718 if ((*self->write_func)(self, &inst, 1) < 0)
1719 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001721 if ((*self->write_func)(self, module_str, module_size) < 0)
1722 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001724 if ((*self->write_func)(self, "\n", 1) < 0)
1725 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001727 if ((*self->write_func)(self, name_str, name_size) < 0)
1728 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001730 if ((*self->write_func)(self, "\n", 1) < 0)
1731 goto finally;
1732 }
1733 else if ((*self->write_func)(self, &obj, 1) < 0) {
1734 goto finally;
1735 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001737 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1738 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00001739 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001740 goto finally;
1741 }
1742 else {
1743 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001745 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1746 PyErr_Clear();
1747 res = 0;
1748 goto finally;
1749 }
1750 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001752 if (!PyDict_Check(state)) {
1753 if (put2(self, args) < 0)
1754 goto finally;
1755 }
1756 else {
1757 if (put(self, args) < 0)
1758 goto finally;
1759 }
Tim Peters84e87f32001-03-17 04:50:51 +00001760
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001761 if (save(self, state, 0) < 0)
1762 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001764 if ((*self->write_func)(self, &build, 1) < 0)
1765 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001767 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001768
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001769 finally:
1770 if (self->fast && !fast_save_leave(self, args))
1771 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001773 Py_XDECREF(module);
1774 Py_XDECREF(class);
1775 Py_XDECREF(state);
1776 Py_XDECREF(getinitargs_func);
1777 Py_XDECREF(getstate_func);
1778 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001780 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001781}
1782
1783
Guido van Rossum60456fd1997-04-09 17:36:32 +00001784static int
Tim Peterscba30e22003-02-01 06:24:36 +00001785save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001786{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001787 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001788 char *name_str, *module_str;
1789 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001791 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001793 if (name) {
1794 global_name = name;
1795 Py_INCREF(global_name);
1796 }
1797 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001798 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001799 goto finally;
1800 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001801
Tim Peterscba30e22003-02-01 06:24:36 +00001802 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001803 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001805 if ((module_size = PyString_Size(module)) < 0 ||
1806 (name_size = PyString_Size(global_name)) < 0)
1807 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001809 module_str = PyString_AS_STRING((PyStringObject *)module);
1810 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001811
Guido van Rossum75bfd052002-12-24 18:10:07 +00001812 /* XXX This can be doing a relative import. Clearly it shouldn't,
1813 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001814 mod = PyImport_ImportModule(module_str);
1815 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001816 cPickle_ErrFormat(PicklingError,
1817 "Can't pickle %s: it's not found as %s.%s",
1818 "OSS", args, module, global_name);
1819 goto finally;
1820 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001821 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001822 if (klass == NULL) {
1823 cPickle_ErrFormat(PicklingError,
1824 "Can't pickle %s: it's not found as %s.%s",
1825 "OSS", args, module, global_name);
1826 goto finally;
1827 }
1828 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001829 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001830 cPickle_ErrFormat(PicklingError,
1831 "Can't pickle %s: it's not the same object as %s.%s",
1832 "OSS", args, module, global_name);
1833 goto finally;
1834 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001835 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001837 if ((*self->write_func)(self, &global, 1) < 0)
1838 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001840 if ((*self->write_func)(self, module_str, module_size) < 0)
1841 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001843 if ((*self->write_func)(self, "\n", 1) < 0)
1844 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001846 if ((*self->write_func)(self, name_str, name_size) < 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, "\n", 1) < 0)
1850 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001852 if (put(self, args) < 0)
1853 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001854
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001855 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001857 finally:
1858 Py_XDECREF(module);
1859 Py_XDECREF(global_name);
1860 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001862 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001863}
1864
Guido van Rossum60456fd1997-04-09 17:36:32 +00001865static int
Tim Peterscba30e22003-02-01 06:24:36 +00001866save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001867{
1868 PyObject *pid = 0;
1869 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001870
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001871 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001872
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001873 Py_INCREF(args);
1874 ARG_TUP(self, args);
1875 if (self->arg) {
1876 pid = PyObject_Call(f, self->arg, NULL);
1877 FREE_ARG_TUP(self);
1878 }
1879 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001880
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001881 if (pid != Py_None) {
1882 if (!self->bin) {
1883 if (!PyString_Check(pid)) {
1884 PyErr_SetString(PicklingError,
1885 "persistent id must be string");
1886 goto finally;
1887 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001888
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001889 if ((*self->write_func)(self, &persid, 1) < 0)
1890 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001892 if ((size = PyString_Size(pid)) < 0)
1893 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001895 if ((*self->write_func)(self,
1896 PyString_AS_STRING((PyStringObject *)pid), size) < 0)
1897 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001898
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001899 if ((*self->write_func)(self, "\n", 1) < 0)
1900 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001901
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001902 res = 1;
1903 goto finally;
1904 }
1905 else if (save(self, pid, 1) >= 0) {
1906 if ((*self->write_func)(self, &binpersid, 1) < 0)
1907 res = -1;
1908 else
1909 res = 1;
1910 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001911
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001912 goto finally;
1913 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001915 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001916
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001917 finally:
1918 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001919
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001920 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001921}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001922
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001923
Tim Peters84e87f32001-03-17 04:50:51 +00001924static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00001925save_reduce(Picklerobject *self, PyObject *callable,
Tim Peterscba30e22003-02-01 06:24:36 +00001926 PyObject *tup, PyObject *state, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001927{
1928 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001929
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001930 if (save(self, callable, 0) < 0)
1931 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001932
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001933 if (save(self, tup, 0) < 0)
1934 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001935
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001936 if ((*self->write_func)(self, &reduce, 1) < 0)
1937 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001939 if (ob != NULL) {
1940 if (state && !PyDict_Check(state)) {
1941 if (put2(self, ob) < 0)
1942 return -1;
1943 }
1944 else {
1945 if (put(self, ob) < 0)
1946 return -1;
1947 }
1948 }
Tim Peters84e87f32001-03-17 04:50:51 +00001949
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001950 if (state) {
1951 if (save(self, state, 0) < 0)
1952 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001953
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001954 if ((*self->write_func)(self, &build, 1) < 0)
1955 return -1;
1956 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001958 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001959}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001960
Guido van Rossum60456fd1997-04-09 17:36:32 +00001961static int
Tim Peterscba30e22003-02-01 06:24:36 +00001962save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001963{
1964 PyTypeObject *type;
1965 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
1966 *callable = 0, *state = 0;
1967 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001968
Martin v. Löwis5a395302002-08-04 08:20:23 +00001969 if (self->nesting++ > Py_GetRecursionLimit()){
1970 PyErr_SetString(PyExc_RuntimeError,
1971 "maximum recursion depth exceeded");
1972 goto finally;
1973 }
1974
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001975 if (!pers_save && self->pers_func) {
1976 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
1977 res = tmp;
1978 goto finally;
1979 }
1980 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001981
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001982 if (args == Py_None) {
1983 res = save_none(self, args);
1984 goto finally;
1985 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001986
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001987 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001988
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001989 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00001990 case 'b':
1991 if (args == Py_False || args == Py_True) {
1992 res = save_bool(self, args);
1993 goto finally;
1994 }
1995 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001996 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001997 if (type == &PyInt_Type) {
1998 res = save_int(self, args);
1999 goto finally;
2000 }
2001 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002002
Guido van Rossum60456fd1997-04-09 17:36:32 +00002003 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002004 if (type == &PyLong_Type) {
2005 res = save_long(self, args);
2006 goto finally;
2007 }
2008 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002009
Guido van Rossum60456fd1997-04-09 17:36:32 +00002010 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002011 if (type == &PyFloat_Type) {
2012 res = save_float(self, args);
2013 goto finally;
2014 }
2015 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002016
Guido van Rossum60456fd1997-04-09 17:36:32 +00002017 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002018 if (type == &PyTuple_Type && PyTuple_Size(args)==0) {
2019 if (self->bin) res = save_empty_tuple(self, args);
2020 else res = save_tuple(self, args);
2021 goto finally;
2022 }
2023 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002024
Guido van Rossum60456fd1997-04-09 17:36:32 +00002025 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002026 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2027 res = save_string(self, args, 0);
2028 goto finally;
2029 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002030
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002031#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002032 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002033 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2034 res = save_unicode(self, args, 0);
2035 goto finally;
2036 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002037#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002038 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002039
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002040 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002041 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002042 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002043
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002044 if (PyDict_GetItem(self->memo, py_ob_id)) {
2045 if (get(self, py_ob_id) < 0)
2046 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002047
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002048 res = 0;
2049 goto finally;
2050 }
2051 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002052
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002053 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002054 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002055 if (type == &PyString_Type) {
2056 res = save_string(self, args, 1);
2057 goto finally;
2058 }
2059 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002060
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002061#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002062 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002063 if (type == &PyUnicode_Type) {
2064 res = save_unicode(self, args, 1);
2065 goto finally;
2066 }
2067 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002068#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002069
Guido van Rossum60456fd1997-04-09 17:36:32 +00002070 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002071 if (type == &PyTuple_Type) {
2072 res = save_tuple(self, args);
2073 goto finally;
2074 }
2075 if (type == &PyType_Type) {
2076 res = save_global(self, args, NULL);
2077 goto finally;
2078 }
2079 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002080
Guido van Rossum60456fd1997-04-09 17:36:32 +00002081 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002082 if (type == &PyList_Type) {
2083 res = save_list(self, args);
2084 goto finally;
2085 }
2086 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002087
2088 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002089 if (type == &PyDict_Type) {
2090 res = save_dict(self, args);
2091 goto finally;
2092 }
2093 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002094
2095 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002096 if (type == &PyInstance_Type) {
2097 res = save_inst(self, args);
2098 goto finally;
2099 }
2100 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002101
2102 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002103 if (type == &PyClass_Type) {
2104 res = save_global(self, args, NULL);
2105 goto finally;
2106 }
2107 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002108
2109 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002110 if (type == &PyFunction_Type) {
2111 res = save_global(self, args, NULL);
2112 goto finally;
2113 }
2114 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002115
2116 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002117 if (type == &PyCFunction_Type) {
2118 res = save_global(self, args, NULL);
2119 goto finally;
2120 }
2121 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002123 if (!pers_save && self->inst_pers_func) {
2124 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2125 res = tmp;
2126 goto finally;
2127 }
2128 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002129
Jeremy Hylton39c61162002-07-16 19:47:43 +00002130 if (PyType_IsSubtype(type, &PyType_Type)) {
2131 res = save_global(self, args, NULL);
2132 goto finally;
2133 }
2134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002135 if ((__reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type))) {
2136 Py_INCREF(__reduce__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002138 Py_INCREF(args);
2139 ARG_TUP(self, args);
2140 if (self->arg) {
2141 t = PyObject_Call(__reduce__, self->arg, NULL);
2142 FREE_ARG_TUP(self);
2143 }
2144 if (! t) goto finally;
2145 }
2146 else {
2147 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00002148
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002149 if ((__reduce__ = PyObject_GetAttr(args, __reduce___str))) {
2150 t = PyObject_Call(__reduce__, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00002151 if (!t)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002152 goto finally;
2153 }
2154 else {
2155 PyErr_Clear();
2156 }
2157 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002159 if (t) {
2160 if (PyString_Check(t)) {
2161 res = save_global(self, args, t);
2162 goto finally;
2163 }
Tim Peters84e87f32001-03-17 04:50:51 +00002164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002165 if (!PyTuple_Check(t)) {
2166 cPickle_ErrFormat(PicklingError, "Value returned by %s must "
2167 "be a tuple", "O", __reduce__);
2168 goto finally;
2169 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002170
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002171 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002173 if ((size != 3) && (size != 2)) {
2174 cPickle_ErrFormat(PicklingError, "tuple returned by %s must "
2175 "contain only two or three elements", "O", __reduce__);
2176 goto finally;
2177 }
Tim Peters84e87f32001-03-17 04:50:51 +00002178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002179 callable = PyTuple_GET_ITEM(t, 0);
Guido van Rossum142eeb81997-08-13 03:14:41 +00002180
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002181 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002182
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002183 if (size > 2) {
2184 state = PyTuple_GET_ITEM(t, 2);
Guido van Rossum8e0ad0c2003-01-31 21:10:31 +00002185 if (state == Py_None)
2186 state = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002187 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002188
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002189 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
2190 cPickle_ErrFormat(PicklingError, "Second element of tuple "
2191 "returned by %s must be a tuple", "O", __reduce__);
2192 goto finally;
2193 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002195 res = save_reduce(self, callable, arg_tup, state, args);
2196 goto finally;
2197 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002198
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002199 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002200
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002201 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002202 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002203 Py_XDECREF(py_ob_id);
2204 Py_XDECREF(__reduce__);
2205 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002206
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002207 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002208}
2209
2210
2211static int
Tim Peterscba30e22003-02-01 06:24:36 +00002212dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002213{
2214 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002215
Tim Peters4190fb82003-02-02 16:09:05 +00002216 if (self->proto >= 2) {
2217 char bytes[2];
2218
2219 bytes[0] = PROTO;
2220 bytes[1] = CURRENT_PROTOCOL_NUMBER;
2221 if (self->write_func(self, bytes, 2) < 0)
2222 return -1;
2223 }
2224
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002225 if (save(self, args, 0) < 0)
2226 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002227
Tim Peters4190fb82003-02-02 16:09:05 +00002228 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002229 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002230
Tim Peters4190fb82003-02-02 16:09:05 +00002231 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002232 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002234 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002235}
2236
2237static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002238Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002239{
Tim Peterscba30e22003-02-01 06:24:36 +00002240 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002241 PyDict_Clear(self->memo);
2242 Py_INCREF(Py_None);
2243 return Py_None;
2244}
2245
2246static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002247Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002248{
2249 int l, i, rsize, ssize, clear=1, lm;
2250 long ik;
2251 PyObject *k, *r;
2252 char *s, *p, *have_get;
2253 Pdata *data;
2254
2255 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002256 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002257 return NULL;
2258
2259 /* Check to make sure we are based on a list */
2260 if (! Pdata_Check(self->file)) {
2261 PyErr_SetString(PicklingError,
2262 "Attempt to getvalue() a non-list-based pickler");
2263 return NULL;
2264 }
2265
2266 /* flush write buffer */
2267 if (write_other(self, NULL, 0) < 0) return NULL;
2268
2269 data=(Pdata*)self->file;
2270 l=data->length;
2271
2272 /* set up an array to hold get/put status */
2273 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2274 lm++;
2275 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
2276 memset(have_get,0,lm);
2277
2278 /* Scan for gets. */
2279 for (rsize=0, i=l; --i >= 0; ) {
2280 k=data->data[i];
2281
2282 if (PyString_Check(k)) {
2283 rsize += PyString_GET_SIZE(k);
2284 }
2285
2286 else if (PyInt_Check(k)) { /* put */
2287 ik=PyInt_AS_LONG((PyIntObject*)k);
2288 if (ik >= lm || ik==0) {
2289 PyErr_SetString(PicklingError,
2290 "Invalid get data");
2291 return NULL;
2292 }
2293 if (have_get[ik]) { /* with matching get */
2294 if (ik < 256) rsize += 2;
2295 else rsize+=5;
2296 }
2297 }
2298
2299 else if (! (PyTuple_Check(k) &&
2300 PyTuple_GET_SIZE(k) == 2 &&
2301 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2302 ) {
2303 PyErr_SetString(PicklingError,
2304 "Unexpected data in internal list");
2305 return NULL;
2306 }
2307
2308 else { /* put */
2309 ik=PyInt_AS_LONG((PyIntObject*)k);
2310 if (ik >= lm || ik==0) {
2311 PyErr_SetString(PicklingError,
2312 "Invalid get data");
2313 return NULL;
2314 }
2315 have_get[ik]=1;
2316 if (ik < 256) rsize += 2;
2317 else rsize+=5;
2318 }
2319
2320 }
2321
2322 /* Now generate the result */
2323 if (!( r=PyString_FromStringAndSize(NULL,rsize))) goto err;
2324 s=PyString_AS_STRING((PyStringObject*)r);
2325
2326 for (i=0; i<l; i++) {
2327 k=data->data[i];
2328
2329 if (PyString_Check(k)) {
2330 ssize=PyString_GET_SIZE(k);
2331 if (ssize) {
2332 p=PyString_AS_STRING((PyStringObject*)k);
2333 while (--ssize >= 0) *s++=*p++;
2334 }
2335 }
2336
2337 else if (PyTuple_Check(k)) { /* get */
2338 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2339 if (ik < 256) {
2340 *s++ = BINGET;
2341 *s++ = (int)(ik & 0xff);
2342 }
2343 else {
2344 *s++ = LONG_BINGET;
2345 *s++ = (int)(ik & 0xff);
2346 *s++ = (int)((ik >> 8) & 0xff);
2347 *s++ = (int)((ik >> 16) & 0xff);
2348 *s++ = (int)((ik >> 24) & 0xff);
2349 }
2350 }
2351
2352 else { /* put */
2353 ik=PyInt_AS_LONG((PyIntObject*)k);
2354
2355 if (have_get[ik]) { /* with matching get */
2356 if (ik < 256) {
2357 *s++ = BINPUT;
2358 *s++ = (int)(ik & 0xff);
2359 }
2360 else {
2361 *s++ = LONG_BINPUT;
2362 *s++ = (int)(ik & 0xff);
2363 *s++ = (int)((ik >> 8) & 0xff);
2364 *s++ = (int)((ik >> 16) & 0xff);
2365 *s++ = (int)((ik >> 24) & 0xff);
2366 }
2367 }
2368 }
2369
2370 }
2371
2372 if (clear) {
2373 PyDict_Clear(self->memo);
2374 Pdata_clear(data,0);
2375 }
2376
2377 free(have_get);
2378 return r;
2379 err:
2380 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002381 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002382}
2383
2384static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002385Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002386{
2387 PyObject *ob;
2388 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002389
Tim Peterscba30e22003-02-01 06:24:36 +00002390 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002391 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002393 if (dump(self, ob) < 0)
2394 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002396 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002398 /* XXX Why does dump() return self? */
2399 Py_INCREF(self);
2400 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002401}
2402
2403
Tim Peterscba30e22003-02-01 06:24:36 +00002404static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002405{
Neal Norwitzb0493252002-03-31 14:44:22 +00002406 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002407 PyDoc_STR("dump(object) -- "
2408 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002409 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002410 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002411 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002412 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002413 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002414};
2415
2416
2417static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002418newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002419{
2420 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002421
Tim Peters5bd2a792003-02-01 16:45:06 +00002422 if (proto < 0)
2423 proto = CURRENT_PROTOCOL_NUMBER;
2424 if (proto > CURRENT_PROTOCOL_NUMBER) {
2425 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2426 "the highest available protocol is %d",
2427 proto, CURRENT_PROTOCOL_NUMBER);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002428 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002429 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002430
Tim Peters5bd2a792003-02-01 16:45:06 +00002431 self = PyObject_New(Picklerobject, &Picklertype);
2432 if (self == NULL)
2433 return NULL;
2434 self->proto = proto;
2435 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002436 self->fp = NULL;
2437 self->write = NULL;
2438 self->memo = NULL;
2439 self->arg = NULL;
2440 self->pers_func = NULL;
2441 self->inst_pers_func = NULL;
2442 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002443 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002444 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002445 self->fast_container = 0;
2446 self->fast_memo = NULL;
2447 self->buf_size = 0;
2448 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002449
Tim Peters5bd2a792003-02-01 16:45:06 +00002450 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002451 if (file)
2452 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002453 else {
2454 file = Pdata_New();
2455 if (file == NULL)
2456 goto err;
2457 }
2458 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002459
Tim Peterscba30e22003-02-01 06:24:36 +00002460 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002461 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002462
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002463 if (PyFile_Check(file)) {
2464 self->fp = PyFile_AsFile(file);
2465 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002466 PyErr_SetString(PyExc_ValueError,
2467 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002468 goto err;
2469 }
2470 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002471 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002472 else if (PycStringIO_OutputCheck(file)) {
2473 self->write_func = write_cStringIO;
2474 }
2475 else if (file == Py_None) {
2476 self->write_func = write_none;
2477 }
2478 else {
2479 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002480
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002481 if (! Pdata_Check(file)) {
2482 self->write = PyObject_GetAttr(file, write_str);
2483 if (!self->write) {
2484 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002485 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002486 "argument must have 'write' "
2487 "attribute");
2488 goto err;
2489 }
2490 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002491
Tim Peters5bd2a792003-02-01 16:45:06 +00002492 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2493 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002494 PyErr_NoMemory();
2495 goto err;
2496 }
2497 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002499 if (PyEval_GetRestricted()) {
2500 /* Restricted execution, get private tables */
2501 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002502
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002503 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2504 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2505 Py_DECREF(m);
2506 if (!( self->dispatch_table )) goto err;
2507 }
2508 else {
2509 self->dispatch_table=dispatch_table;
2510 Py_INCREF(dispatch_table);
2511 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002512
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002513 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002515 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002516 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002517 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002518}
2519
2520
2521static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002522get_Pickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002523{
2524 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002525 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002526
Tim Peters5bd2a792003-02-01 16:45:06 +00002527 /* XXX What is this doing? The documented signature is
2528 * XXX Pickler(file, proto=0), but this accepts Pickler() and
2529 * XXX Pickler(integer) too. The meaning then is clear as mud.
2530 * XXX Bug? Feature?
2531 */
2532 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002533 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002534 proto = 0;
2535 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002536 return NULL;
2537 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002538 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002539}
2540
2541
2542static void
Tim Peterscba30e22003-02-01 06:24:36 +00002543Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002544{
2545 Py_XDECREF(self->write);
2546 Py_XDECREF(self->memo);
2547 Py_XDECREF(self->fast_memo);
2548 Py_XDECREF(self->arg);
2549 Py_XDECREF(self->file);
2550 Py_XDECREF(self->pers_func);
2551 Py_XDECREF(self->inst_pers_func);
2552 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002553 PyMem_Free(self->write_buf);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002554 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002555}
2556
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002557static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002558Pickler_get_pers_func(Picklerobject *p)
2559{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002560 if (p->pers_func == NULL)
2561 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2562 else
2563 Py_INCREF(p->pers_func);
2564 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002565}
2566
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002567static int
2568Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2569{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002570 if (v == NULL) {
2571 PyErr_SetString(PyExc_TypeError,
2572 "attribute deletion is not supported");
2573 return -1;
2574 }
2575 Py_XDECREF(p->pers_func);
2576 Py_INCREF(v);
2577 p->pers_func = v;
2578 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002579}
2580
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002581static int
2582Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2583{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002584 if (v == NULL) {
2585 PyErr_SetString(PyExc_TypeError,
2586 "attribute deletion is not supported");
2587 return -1;
2588 }
2589 Py_XDECREF(p->inst_pers_func);
2590 Py_INCREF(v);
2591 p->inst_pers_func = v;
2592 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002593}
2594
2595static PyObject *
2596Pickler_get_memo(Picklerobject *p)
2597{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002598 if (p->memo == NULL)
2599 PyErr_SetString(PyExc_AttributeError, "memo");
2600 else
2601 Py_INCREF(p->memo);
2602 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002603}
2604
2605static int
2606Pickler_set_memo(Picklerobject *p, PyObject *v)
2607{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002608 if (v == NULL) {
2609 PyErr_SetString(PyExc_TypeError,
2610 "attribute deletion is not supported");
2611 return -1;
2612 }
2613 if (!PyDict_Check(v)) {
2614 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2615 return -1;
2616 }
2617 Py_XDECREF(p->memo);
2618 Py_INCREF(v);
2619 p->memo = v;
2620 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002621}
2622
2623static PyObject *
2624Pickler_get_error(Picklerobject *p)
2625{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002626 /* why is this an attribute on the Pickler? */
2627 Py_INCREF(PicklingError);
2628 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002629}
2630
2631static PyMemberDef Pickler_members[] = {
2632 {"binary", T_INT, offsetof(Picklerobject, bin)},
2633 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002634 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002635};
2636
2637static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002638 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002639 (setter)Pickler_set_pers_func},
2640 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2641 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002642 {"PicklingError", (getter)Pickler_get_error, NULL},
2643 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002644};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002645
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002646PyDoc_STRVAR(Picklertype__doc__,
2647"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002648
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002649static PyTypeObject Picklertype = {
2650 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002651 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002652 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002653 sizeof(Picklerobject), /*tp_basicsize*/
2654 0,
2655 (destructor)Pickler_dealloc, /* tp_dealloc */
2656 0, /* tp_print */
2657 0, /* tp_getattr */
2658 0, /* tp_setattr */
2659 0, /* tp_compare */
2660 0, /* tp_repr */
2661 0, /* tp_as_number */
2662 0, /* tp_as_sequence */
2663 0, /* tp_as_mapping */
2664 0, /* tp_hash */
2665 0, /* tp_call */
2666 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002667 PyObject_GenericGetAttr, /* tp_getattro */
2668 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002669 0, /* tp_as_buffer */
2670 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2671 Picklertype__doc__, /* tp_doc */
2672 0, /* tp_traverse */
2673 0, /* tp_clear */
2674 0, /* tp_richcompare */
2675 0, /* tp_weaklistoffset */
2676 0, /* tp_iter */
2677 0, /* tp_iternext */
2678 Pickler_methods, /* tp_methods */
2679 Pickler_members, /* tp_members */
2680 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002681};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002682
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002683static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002684find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002685{
2686 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002687
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002688 if (fc) {
2689 if (fc==Py_None) {
2690 PyErr_SetString(UnpicklingError,
2691 "Global and instance pickles are not supported.");
2692 return NULL;
2693 }
Tim Peterscba30e22003-02-01 06:24:36 +00002694 return PyObject_CallFunction(fc, "OO", py_module_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002695 py_global_name);
2696 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002698 module = PySys_GetObject("modules");
2699 if (module == NULL)
2700 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002702 module = PyDict_GetItem(module, py_module_name);
2703 if (module == NULL) {
2704 module = PyImport_Import(py_module_name);
2705 if (!module)
2706 return NULL;
2707 global = PyObject_GetAttr(module, py_global_name);
2708 Py_DECREF(module);
2709 }
2710 else
2711 global = PyObject_GetAttr(module, py_global_name);
2712 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002713}
2714
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002715static int
Tim Peterscba30e22003-02-01 06:24:36 +00002716marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002717{
2718 if (self->num_marks < 1) {
2719 PyErr_SetString(UnpicklingError, "could not find MARK");
2720 return -1;
2721 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002722
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002723 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002724}
2725
Tim Peters84e87f32001-03-17 04:50:51 +00002726
Guido van Rossum60456fd1997-04-09 17:36:32 +00002727static int
Tim Peterscba30e22003-02-01 06:24:36 +00002728load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002729{
2730 PDATA_APPEND(self->stack, Py_None, -1);
2731 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002732}
2733
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002734static int
Tim Peterscba30e22003-02-01 06:24:36 +00002735bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002736{
2737 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2738 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002739}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002740
2741static int
Tim Peterscba30e22003-02-01 06:24:36 +00002742load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002743{
2744 PyObject *py_int = 0;
2745 char *endptr, *s;
2746 int len, res = -1;
2747 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002749 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2750 if (len < 2) return bad_readline();
2751 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002753 errno = 0;
2754 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002756 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2757 /* Hm, maybe we've got something long. Let's try reading
2758 it as a Python long object. */
2759 errno = 0;
2760 py_int = PyLong_FromString(s, NULL, 0);
2761 if (py_int == NULL) {
2762 PyErr_SetString(PyExc_ValueError,
2763 "could not convert string to int");
2764 goto finally;
2765 }
2766 }
2767 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002768 if (len == 3 && (l == 0 || l == 1)) {
2769 if (!( py_int = PyBool_FromLong(l))) goto finally;
2770 }
2771 else {
2772 if (!( py_int = PyInt_FromLong(l))) goto finally;
2773 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002774 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002776 free(s);
2777 PDATA_PUSH(self->stack, py_int, -1);
2778 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002780 finally:
2781 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002783 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002784}
2785
Tim Petersee1a53c2003-02-02 02:57:53 +00002786/* s contains x bytes of a little-endian integer. Return its value as a
2787 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
2788 * int, but when x is 4 it's a signed one. This is an historical source
2789 * of x-platform bugs.
2790 */
Tim Peters84e87f32001-03-17 04:50:51 +00002791static long
Tim Petersee1a53c2003-02-02 02:57:53 +00002792calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002793{
2794 unsigned char c;
2795 int i;
2796 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002797
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002798 for (i = 0, l = 0L; i < x; i++) {
2799 c = (unsigned char)s[i];
2800 l |= (long)c << (i * 8);
2801 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002802#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002803 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2804 * is signed, so on a box with longs bigger than 4 bytes we need
2805 * to extend a BININT's sign bit to the full width.
2806 */
2807 if (x == 4 && l & (1L << 31))
2808 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002809#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002810 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002811}
2812
2813
2814static int
Tim Peterscba30e22003-02-01 06:24:36 +00002815load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002816{
2817 PyObject *py_int = 0;
2818 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002819
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002820 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002821
Tim Peterscba30e22003-02-01 06:24:36 +00002822 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002823 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002824
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002825 PDATA_PUSH(self->stack, py_int, -1);
2826 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002827}
2828
2829
2830static int
Tim Peterscba30e22003-02-01 06:24:36 +00002831load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002832{
2833 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002835 if ((*self->read_func)(self, &s, 4) < 0)
2836 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002837
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002838 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002839}
2840
2841
2842static int
Tim Peterscba30e22003-02-01 06:24:36 +00002843load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002844{
2845 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002847 if ((*self->read_func)(self, &s, 1) < 0)
2848 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002850 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002851}
2852
2853
2854static int
Tim Peterscba30e22003-02-01 06:24:36 +00002855load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002856{
2857 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002859 if ((*self->read_func)(self, &s, 2) < 0)
2860 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002862 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002863}
Tim Peters84e87f32001-03-17 04:50:51 +00002864
Guido van Rossum60456fd1997-04-09 17:36:32 +00002865static int
Tim Peterscba30e22003-02-01 06:24:36 +00002866load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002867{
2868 PyObject *l = 0;
2869 char *end, *s;
2870 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002871
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002872 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2873 if (len < 2) return bad_readline();
2874 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002875
Tim Peterscba30e22003-02-01 06:24:36 +00002876 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002877 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002879 free(s);
2880 PDATA_PUSH(self->stack, l, -1);
2881 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002883 finally:
2884 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002886 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002887}
2888
Tim Petersee1a53c2003-02-02 02:57:53 +00002889/* 'size' bytes contain the # of bytes of little-endian 256's-complement
2890 * data following.
2891 */
2892static int
2893load_counted_long(Unpicklerobject *self, int size)
2894{
2895 int i;
2896 char *nbytes;
2897 unsigned char *pdata;
2898 PyObject *along;
2899
2900 assert(size == 1 || size == 4);
2901 i = self->read_func(self, &nbytes, size);
2902 if (i < 0) return -1;
2903
2904 size = calc_binint(nbytes, size);
2905 if (size < 0) {
2906 /* Corrupt or hostile pickle -- we never write one like
2907 * this.
2908 */
2909 PyErr_SetString(PyExc_ValueError, "LONG pickle has negative "
2910 "byte count");
2911 return -1;
2912 }
2913
2914 if (size == 0)
2915 along = PyLong_FromLong(0L);
2916 else {
2917 /* Read the raw little-endian bytes & convert. */
2918 i = self->read_func(self, &(char *)pdata, size);
2919 if (i < 0) return -1;
2920 along = _PyLong_FromByteArray(pdata, (size_t)size,
2921 1 /* little endian */, 1 /* signed */);
2922 }
2923 if (along == NULL)
2924 return -1;
2925 PDATA_PUSH(self->stack, along, -1);
2926 return 0;
2927}
Tim Peters84e87f32001-03-17 04:50:51 +00002928
Guido van Rossum60456fd1997-04-09 17:36:32 +00002929static int
Tim Peterscba30e22003-02-01 06:24:36 +00002930load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002931{
2932 PyObject *py_float = 0;
2933 char *endptr, *s;
2934 int len, res = -1;
2935 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002936
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002937 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2938 if (len < 2) return bad_readline();
2939 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002941 errno = 0;
2942 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002944 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2945 PyErr_SetString(PyExc_ValueError,
2946 "could not convert string to float");
2947 goto finally;
2948 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002949
Tim Peterscba30e22003-02-01 06:24:36 +00002950 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002951 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002953 free(s);
2954 PDATA_PUSH(self->stack, py_float, -1);
2955 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002957 finally:
2958 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002959
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002960 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002961}
2962
Guido van Rossum60456fd1997-04-09 17:36:32 +00002963static int
Tim Peterscba30e22003-02-01 06:24:36 +00002964load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002965{
2966 PyObject *py_float = 0;
2967 int s, e;
2968 long fhi, flo;
2969 double x;
2970 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002971
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002972 if ((*self->read_func)(self, &p, 8) < 0)
2973 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002974
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002975 /* First byte */
2976 s = (*p>>7) & 1;
2977 e = (*p & 0x7F) << 4;
2978 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002979
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002980 /* Second byte */
2981 e |= (*p>>4) & 0xF;
2982 fhi = (*p & 0xF) << 24;
2983 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002984
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002985 /* Third byte */
2986 fhi |= (*p & 0xFF) << 16;
2987 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002988
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002989 /* Fourth byte */
2990 fhi |= (*p & 0xFF) << 8;
2991 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002992
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002993 /* Fifth byte */
2994 fhi |= *p & 0xFF;
2995 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002996
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002997 /* Sixth byte */
2998 flo = (*p & 0xFF) << 16;
2999 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003001 /* Seventh byte */
3002 flo |= (*p & 0xFF) << 8;
3003 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003004
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003005 /* Eighth byte */
3006 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003007
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003008 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
3009 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003010
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003011 /* XXX This sadly ignores Inf/NaN */
3012 if (e == 0)
3013 e = -1022;
3014 else {
3015 x += 1.0;
3016 e -= 1023;
3017 }
3018 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003019
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003020 if (s)
3021 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003023 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003024
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003025 PDATA_PUSH(self->stack, py_float, -1);
3026 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003027}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003028
3029static int
Tim Peterscba30e22003-02-01 06:24:36 +00003030load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003031{
3032 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003033 int len, res = -1;
3034 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003035
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003036 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3037 if (len < 2) return bad_readline();
3038 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003039
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003040
3041 /* Strip outermost quotes */
3042 while (s[len-1] <= ' ')
3043 len--;
3044 if(s[0]=='"' && s[len-1]=='"'){
3045 s[len-1] = '\0';
3046 p = s + 1 ;
3047 len -= 2;
3048 } else if(s[0]=='\'' && s[len-1]=='\''){
3049 s[len-1] = '\0';
3050 p = s + 1 ;
3051 len -= 2;
3052 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003053 goto insecure;
3054 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003055
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003056 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
3057 if (str) {
3058 PDATA_PUSH(self->stack, str, -1);
3059 res = 0;
3060 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003061 free(s);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003062 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003063
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003064 insecure:
3065 free(s);
3066 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3067 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003068}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003069
3070
3071static int
Tim Peterscba30e22003-02-01 06:24:36 +00003072load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003073{
3074 PyObject *py_string = 0;
3075 long l;
3076 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003077
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003078 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003079
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003080 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003082 if ((*self->read_func)(self, &s, l) < 0)
3083 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003084
Tim Peterscba30e22003-02-01 06:24:36 +00003085 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003086 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003088 PDATA_PUSH(self->stack, py_string, -1);
3089 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003090}
3091
3092
3093static int
Tim Peterscba30e22003-02-01 06:24:36 +00003094load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003095{
3096 PyObject *py_string = 0;
3097 unsigned char l;
3098 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003099
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003100 if ((*self->read_func)(self, &s, 1) < 0)
3101 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003103 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003104
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003105 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003107 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003109 PDATA_PUSH(self->stack, py_string, -1);
3110 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003111}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003112
3113
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003114#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003115static int
Tim Peterscba30e22003-02-01 06:24:36 +00003116load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003117{
3118 PyObject *str = 0;
3119 int len, res = -1;
3120 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003122 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3123 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003124
Tim Peterscba30e22003-02-01 06:24:36 +00003125 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003126 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003128 PDATA_PUSH(self->stack, str, -1);
3129 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003131 finally:
3132 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003133}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003134#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003135
3136
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003137#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003138static int
Tim Peterscba30e22003-02-01 06:24:36 +00003139load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003140{
3141 PyObject *unicode;
3142 long l;
3143 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003144
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003145 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003147 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003148
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003149 if ((*self->read_func)(self, &s, l) < 0)
3150 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003151
Tim Peterscba30e22003-02-01 06:24:36 +00003152 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003153 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003155 PDATA_PUSH(self->stack, unicode, -1);
3156 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003157}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003158#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003159
3160
3161static int
Tim Peterscba30e22003-02-01 06:24:36 +00003162load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003163{
3164 PyObject *tup;
3165 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003167 if ((i = marker(self)) < 0) return -1;
3168 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3169 PDATA_PUSH(self->stack, tup, -1);
3170 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003171}
3172
3173static int
Tim Peterscba30e22003-02-01 06:24:36 +00003174load_empty_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003175{
3176 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003178 if (!( tup=PyTuple_New(0))) return -1;
3179 PDATA_PUSH(self->stack, tup, -1);
3180 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003181}
3182
3183static int
Tim Peterscba30e22003-02-01 06:24:36 +00003184load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003185{
3186 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003188 if (!( list=PyList_New(0))) return -1;
3189 PDATA_PUSH(self->stack, list, -1);
3190 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003191}
3192
3193static int
Tim Peterscba30e22003-02-01 06:24:36 +00003194load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003195{
3196 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003197
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003198 if (!( dict=PyDict_New())) return -1;
3199 PDATA_PUSH(self->stack, dict, -1);
3200 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003201}
3202
3203
3204static int
Tim Peterscba30e22003-02-01 06:24:36 +00003205load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003206{
3207 PyObject *list = 0;
3208 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003209
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003210 if ((i = marker(self)) < 0) return -1;
3211 if (!( list=Pdata_popList(self->stack, i))) return -1;
3212 PDATA_PUSH(self->stack, list, -1);
3213 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003214}
3215
3216static int
Tim Peterscba30e22003-02-01 06:24:36 +00003217load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003218{
3219 PyObject *dict, *key, *value;
3220 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003221
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003222 if ((i = marker(self)) < 0) return -1;
3223 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003224
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003225 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003226
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003227 for (k = i+1; k < j; k += 2) {
3228 key =self->stack->data[k-1];
3229 value=self->stack->data[k ];
3230 if (PyDict_SetItem(dict, key, value) < 0) {
3231 Py_DECREF(dict);
3232 return -1;
3233 }
3234 }
3235 Pdata_clear(self->stack, i);
3236 PDATA_PUSH(self->stack, dict, -1);
3237 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003238}
3239
3240static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003241Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003242{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003243 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003245 if (PyClass_Check(cls)) {
3246 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003247
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003248 if ((l=PyObject_Size(args)) < 0) goto err;
3249 if (!( l )) {
3250 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003251
Tim Peterscba30e22003-02-01 06:24:36 +00003252 __getinitargs__ = PyObject_GetAttr(cls,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003253 __getinitargs___str);
3254 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003255 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003256 so bypass usual construction */
3257 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003259 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003260 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003261 goto err;
3262 return inst;
3263 }
3264 Py_DECREF(__getinitargs__);
3265 }
Tim Peters84e87f32001-03-17 04:50:51 +00003266
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003267 if ((r=PyInstance_New(cls, args, NULL))) return r;
3268 else goto err;
3269 }
Tim Peters84e87f32001-03-17 04:50:51 +00003270
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003271 if (args==Py_None) {
3272 /* Special case, call cls.__basicnew__() */
3273 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003275 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3276 if (!basicnew) return NULL;
3277 r=PyObject_CallObject(basicnew, NULL);
3278 Py_DECREF(basicnew);
3279 if (r) return r;
3280 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003281
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003282 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003284 err:
3285 {
3286 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003288 PyErr_Fetch(&tp, &v, &tb);
3289 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3290 Py_XDECREF(v);
3291 v=r;
3292 }
3293 PyErr_Restore(tp,v,tb);
3294 }
3295 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003296}
Tim Peters84e87f32001-03-17 04:50:51 +00003297
Guido van Rossum60456fd1997-04-09 17:36:32 +00003298
3299static int
Tim Peterscba30e22003-02-01 06:24:36 +00003300load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003301{
3302 PyObject *class, *tup, *obj=0;
3303 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003304
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003305 if ((i = marker(self)) < 0) return -1;
3306 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3307 PDATA_POP(self->stack, class);
3308 if (class) {
3309 obj = Instance_New(class, tup);
3310 Py_DECREF(class);
3311 }
3312 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003314 if (! obj) return -1;
3315 PDATA_PUSH(self->stack, obj, -1);
3316 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003317}
3318
3319
3320static int
Tim Peterscba30e22003-02-01 06:24:36 +00003321load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003322{
3323 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3324 int i, len;
3325 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003326
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003327 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003328
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003329 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3330 if (len < 2) return bad_readline();
3331 module_name = PyString_FromStringAndSize(s, len - 1);
3332 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003333
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003334 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3335 if (len < 2) return bad_readline();
3336 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003337 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003338 self->find_class);
3339 Py_DECREF(class_name);
3340 }
3341 }
3342 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003344 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003345
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003346 if ((tup=Pdata_popTuple(self->stack, i))) {
3347 obj = Instance_New(class, tup);
3348 Py_DECREF(tup);
3349 }
3350 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003351
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003352 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003353
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003354 PDATA_PUSH(self->stack, obj, -1);
3355 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003356}
3357
3358
3359static int
Tim Peterscba30e22003-02-01 06:24:36 +00003360load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003361{
3362 PyObject *class = 0, *module_name = 0, *class_name = 0;
3363 int len;
3364 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003365
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003366 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3367 if (len < 2) return bad_readline();
3368 module_name = PyString_FromStringAndSize(s, len - 1);
3369 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003371 if ((len = (*self->readline_func)(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003372 if (len < 2) {
3373 Py_DECREF(module_name);
3374 return bad_readline();
3375 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003376 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003377 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003378 self->find_class);
3379 Py_DECREF(class_name);
3380 }
3381 }
3382 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003383
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003384 if (! class) return -1;
3385 PDATA_PUSH(self->stack, class, -1);
3386 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003387}
3388
3389
3390static int
Tim Peterscba30e22003-02-01 06:24:36 +00003391load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003392{
3393 PyObject *pid = 0;
3394 int len;
3395 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003397 if (self->pers_func) {
3398 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3399 if (len < 2) return bad_readline();
3400
3401 pid = PyString_FromStringAndSize(s, len - 1);
3402 if (!pid) return -1;
3403
3404 if (PyList_Check(self->pers_func)) {
3405 if (PyList_Append(self->pers_func, pid) < 0) {
3406 Py_DECREF(pid);
3407 return -1;
3408 }
3409 }
3410 else {
3411 ARG_TUP(self, pid);
3412 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003413 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003414 NULL);
3415 FREE_ARG_TUP(self);
3416 }
3417 }
3418
3419 if (! pid) return -1;
3420
3421 PDATA_PUSH(self->stack, pid, -1);
3422 return 0;
3423 }
3424 else {
3425 PyErr_SetString(UnpicklingError,
3426 "A load persistent id instruction was encountered,\n"
3427 "but no persistent_load function was specified.");
3428 return -1;
3429 }
3430}
3431
3432static int
Tim Peterscba30e22003-02-01 06:24:36 +00003433load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003434{
3435 PyObject *pid = 0;
3436
3437 if (self->pers_func) {
3438 PDATA_POP(self->stack, pid);
3439 if (! pid) return -1;
3440
3441 if (PyList_Check(self->pers_func)) {
3442 if (PyList_Append(self->pers_func, pid) < 0) {
3443 Py_DECREF(pid);
3444 return -1;
3445 }
3446 }
3447 else {
3448 ARG_TUP(self, pid);
3449 if (self->arg) {
3450 pid = PyObject_Call(self->pers_func, self->arg,
3451 NULL);
3452 FREE_ARG_TUP(self);
3453 }
3454 if (! pid) return -1;
3455 }
3456
3457 PDATA_PUSH(self->stack, pid, -1);
3458 return 0;
3459 }
3460 else {
3461 PyErr_SetString(UnpicklingError,
3462 "A load persistent id instruction was encountered,\n"
3463 "but no persistent_load function was specified.");
3464 return -1;
3465 }
3466}
3467
3468
3469static int
Tim Peterscba30e22003-02-01 06:24:36 +00003470load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003471{
3472 int len;
3473
3474 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3475
3476 /* Note that we split the (pickle.py) stack into two stacks,
3477 an object stack and a mark stack. We have to be clever and
3478 pop the right one. We do this by looking at the top of the
3479 mark stack.
3480 */
3481
3482 if ((self->num_marks > 0) &&
3483 (self->marks[self->num_marks - 1] == len))
3484 self->num_marks--;
3485 else {
3486 len--;
3487 Py_DECREF(self->stack->data[len]);
3488 self->stack->length=len;
3489 }
3490
3491 return 0;
3492}
3493
3494
3495static int
Tim Peterscba30e22003-02-01 06:24:36 +00003496load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003497{
3498 int i;
3499
3500 if ((i = marker(self)) < 0)
3501 return -1;
3502
3503 Pdata_clear(self->stack, i);
3504
3505 return 0;
3506}
3507
3508
3509static int
Tim Peterscba30e22003-02-01 06:24:36 +00003510load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003511{
3512 PyObject *last;
3513 int len;
3514
3515 if ((len = self->stack->length) <= 0) return stackUnderflow();
3516 last=self->stack->data[len-1];
3517 Py_INCREF(last);
3518 PDATA_PUSH(self->stack, last, -1);
3519 return 0;
3520}
3521
3522
3523static int
Tim Peterscba30e22003-02-01 06:24:36 +00003524load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003525{
3526 PyObject *py_str = 0, *value = 0;
3527 int len;
3528 char *s;
3529 int rc;
3530
3531 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003532 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003534 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003536 value = PyDict_GetItem(self->memo, py_str);
3537 if (! value) {
3538 PyErr_SetObject(BadPickleGet, py_str);
3539 rc = -1;
3540 } else {
3541 PDATA_APPEND(self->stack, value, -1);
3542 rc = 0;
3543 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003545 Py_DECREF(py_str);
3546 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003547}
3548
3549
3550static int
Tim Peterscba30e22003-02-01 06:24:36 +00003551load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003552{
3553 PyObject *py_key = 0, *value = 0;
3554 unsigned char key;
3555 char *s;
3556 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003558 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003559
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003560 key = (unsigned char)s[0];
3561 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003562
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003563 value = PyDict_GetItem(self->memo, py_key);
3564 if (! value) {
3565 PyErr_SetObject(BadPickleGet, py_key);
3566 rc = -1;
3567 } else {
3568 PDATA_APPEND(self->stack, value, -1);
3569 rc = 0;
3570 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003571
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003572 Py_DECREF(py_key);
3573 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003574}
3575
3576
3577static int
Tim Peterscba30e22003-02-01 06:24:36 +00003578load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003579{
3580 PyObject *py_key = 0, *value = 0;
3581 unsigned char c;
3582 char *s;
3583 long key;
3584 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003585
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003586 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003588 c = (unsigned char)s[0];
3589 key = (long)c;
3590 c = (unsigned char)s[1];
3591 key |= (long)c << 8;
3592 c = (unsigned char)s[2];
3593 key |= (long)c << 16;
3594 c = (unsigned char)s[3];
3595 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003596
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003597 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3598
3599 value = PyDict_GetItem(self->memo, py_key);
3600 if (! value) {
3601 PyErr_SetObject(BadPickleGet, py_key);
3602 rc = -1;
3603 } else {
3604 PDATA_APPEND(self->stack, value, -1);
3605 rc = 0;
3606 }
3607
3608 Py_DECREF(py_key);
3609 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003610}
3611
3612
3613static int
Tim Peterscba30e22003-02-01 06:24:36 +00003614load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003615{
3616 PyObject *py_str = 0, *value = 0;
3617 int len, l;
3618 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003619
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003620 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
3621 if (l < 2) return bad_readline();
3622 if (!( len=self->stack->length )) return stackUnderflow();
3623 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3624 value=self->stack->data[len-1];
3625 l=PyDict_SetItem(self->memo, py_str, value);
3626 Py_DECREF(py_str);
3627 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003628}
3629
3630
3631static int
Tim Peterscba30e22003-02-01 06:24:36 +00003632load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003633{
3634 PyObject *py_key = 0, *value = 0;
3635 unsigned char key;
3636 char *s;
3637 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003638
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003639 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3640 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003641
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003642 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003644 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3645 value=self->stack->data[len-1];
3646 len=PyDict_SetItem(self->memo, py_key, value);
3647 Py_DECREF(py_key);
3648 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003649}
3650
3651
3652static int
Tim Peterscba30e22003-02-01 06:24:36 +00003653load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003654{
3655 PyObject *py_key = 0, *value = 0;
3656 long key;
3657 unsigned char c;
3658 char *s;
3659 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003660
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003661 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3662 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003663
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003664 c = (unsigned char)s[0];
3665 key = (long)c;
3666 c = (unsigned char)s[1];
3667 key |= (long)c << 8;
3668 c = (unsigned char)s[2];
3669 key |= (long)c << 16;
3670 c = (unsigned char)s[3];
3671 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003672
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003673 if (!( py_key = PyInt_FromLong(key))) return -1;
3674 value=self->stack->data[len-1];
3675 len=PyDict_SetItem(self->memo, py_key, value);
3676 Py_DECREF(py_key);
3677 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003678}
3679
3680
3681static int
Tim Peterscba30e22003-02-01 06:24:36 +00003682do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003683{
3684 PyObject *value = 0, *list = 0, *append_method = 0;
3685 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003687 len=self->stack->length;
3688 if (!( len >= x && x > 0 )) return stackUnderflow();
3689 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003690 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003691
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003692 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003694 if (PyList_Check(list)) {
3695 PyObject *slice;
3696 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003698 slice=Pdata_popList(self->stack, x);
3699 list_len = PyList_GET_SIZE(list);
3700 i=PyList_SetSlice(list, list_len, list_len, slice);
3701 Py_DECREF(slice);
3702 return i;
3703 }
3704 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003705
Tim Peterscba30e22003-02-01 06:24:36 +00003706 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003707 return -1;
3708
3709 for (i = x; i < len; i++) {
3710 PyObject *junk;
3711
3712 value=self->stack->data[i];
3713 junk=0;
3714 ARG_TUP(self, value);
3715 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003716 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003717 NULL);
3718 FREE_ARG_TUP(self);
3719 }
3720 if (! junk) {
3721 Pdata_clear(self->stack, i+1);
3722 self->stack->length=x;
3723 Py_DECREF(append_method);
3724 return -1;
3725 }
3726 Py_DECREF(junk);
3727 }
3728 self->stack->length=x;
3729 Py_DECREF(append_method);
3730 }
3731
3732 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003733}
3734
3735
3736static int
Tim Peterscba30e22003-02-01 06:24:36 +00003737load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003738{
3739 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003740}
3741
3742
3743static int
Tim Peterscba30e22003-02-01 06:24:36 +00003744load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003745{
3746 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003747}
3748
3749
3750static int
Tim Peterscba30e22003-02-01 06:24:36 +00003751do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003752{
3753 PyObject *value = 0, *key = 0, *dict = 0;
3754 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003756 if (!( (len=self->stack->length) >= x
3757 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003759 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003760
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003761 for (i = x+1; i < len; i += 2) {
3762 key =self->stack->data[i-1];
3763 value=self->stack->data[i ];
3764 if (PyObject_SetItem(dict, key, value) < 0) {
3765 r=-1;
3766 break;
3767 }
3768 }
3769
3770 Pdata_clear(self->stack, x);
3771
3772 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003773}
3774
3775
Tim Peters84e87f32001-03-17 04:50:51 +00003776static int
Tim Peterscba30e22003-02-01 06:24:36 +00003777load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003778{
3779 return do_setitems(self, self->stack->length - 2);
3780}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003781
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003782static int
Tim Peterscba30e22003-02-01 06:24:36 +00003783load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003784{
3785 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003786}
3787
Tim Peters84e87f32001-03-17 04:50:51 +00003788
Guido van Rossum60456fd1997-04-09 17:36:32 +00003789static int
Tim Peterscba30e22003-02-01 06:24:36 +00003790load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003791{
3792 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3793 *junk = 0, *__setstate__ = 0;
3794 int i, r = 0;
3795
3796 if (self->stack->length < 2) return stackUnderflow();
3797 PDATA_POP(self->stack, value);
3798 if (! value) return -1;
3799 inst=self->stack->data[self->stack->length-1];
3800
3801 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3802 ARG_TUP(self, value);
3803 if (self->arg) {
3804 junk = PyObject_Call(__setstate__, self->arg, NULL);
3805 FREE_ARG_TUP(self);
3806 }
3807 Py_DECREF(__setstate__);
3808 if (! junk) return -1;
3809 Py_DECREF(junk);
3810 return 0;
3811 }
3812
3813 PyErr_Clear();
3814 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3815 i = 0;
3816 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3817 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3818 r=-1;
3819 break;
3820 }
3821 }
3822 Py_DECREF(instdict);
3823 }
3824 else r=-1;
3825
3826 Py_XDECREF(value);
3827
3828 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003829}
3830
3831
3832static int
Tim Peterscba30e22003-02-01 06:24:36 +00003833load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003834{
3835 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003837 /* Note that we split the (pickle.py) stack into two stacks, an
3838 object stack and a mark stack. Here we push a mark onto the
3839 mark stack.
3840 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003842 if ((self->num_marks + 1) >= self->marks_size) {
3843 s=self->marks_size+20;
3844 if (s <= self->num_marks) s=self->num_marks + 1;
3845 if (self->marks == NULL)
3846 self->marks=(int *)malloc(s * sizeof(int));
3847 else
Tim Peterscba30e22003-02-01 06:24:36 +00003848 self->marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003849 s * sizeof(int));
3850 if (! self->marks) {
3851 PyErr_NoMemory();
3852 return -1;
3853 }
3854 self->marks_size = s;
3855 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003857 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003859 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003860}
3861
Guido van Rossum60456fd1997-04-09 17:36:32 +00003862static int
Tim Peterscba30e22003-02-01 06:24:36 +00003863load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003864{
3865 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003867 PDATA_POP(self->stack, arg_tup);
3868 if (! arg_tup) return -1;
3869 PDATA_POP(self->stack, callable);
3870 if (callable) {
3871 ob = Instance_New(callable, arg_tup);
3872 Py_DECREF(callable);
3873 }
3874 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003876 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003877
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003878 PDATA_PUSH(self->stack, ob, -1);
3879 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003880}
Tim Peters84e87f32001-03-17 04:50:51 +00003881
Tim Peters4190fb82003-02-02 16:09:05 +00003882/* Just raises an error if we don't know the protocol specified. PROTO
3883 * is the first opcode for protocols >= 2.
3884 */
3885static int
3886load_proto(Unpicklerobject *self)
3887{
3888 int i;
3889 char *protobyte;
3890
3891 i = self->read_func(self, &protobyte, 1);
3892 if (i < 0)
3893 return -1;
3894
3895 i = calc_binint(protobyte, 1);
3896 /* No point checking for < 0, since calc_binint returns an unsigned
3897 * int when chewing on 1 byte.
3898 */
3899 assert(i >= 0);
3900 if (i <= CURRENT_PROTOCOL_NUMBER)
3901 return 0;
3902
3903 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
3904 return -1;
3905}
3906
Guido van Rossum60456fd1997-04-09 17:36:32 +00003907static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003908load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003909{
3910 PyObject *err = 0, *val = 0;
3911 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003912
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003913 self->num_marks = 0;
3914 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003916 while (1) {
3917 if ((*self->read_func)(self, &s, 1) < 0)
3918 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003919
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003920 switch (s[0]) {
3921 case NONE:
3922 if (load_none(self) < 0)
3923 break;
3924 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003926 case BININT:
3927 if (load_binint(self) < 0)
3928 break;
3929 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003930
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003931 case BININT1:
3932 if (load_binint1(self) < 0)
3933 break;
3934 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003935
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003936 case BININT2:
3937 if (load_binint2(self) < 0)
3938 break;
3939 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003941 case INT:
3942 if (load_int(self) < 0)
3943 break;
3944 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003946 case LONG:
3947 if (load_long(self) < 0)
3948 break;
3949 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003950
Tim Petersee1a53c2003-02-02 02:57:53 +00003951 case LONG1:
3952 if (load_counted_long(self, 1) < 0)
3953 break;
3954 continue;
3955
3956 case LONG4:
3957 if (load_counted_long(self, 4) < 0)
3958 break;
3959 continue;
3960
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003961 case FLOAT:
3962 if (load_float(self) < 0)
3963 break;
3964 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003966 case BINFLOAT:
3967 if (load_binfloat(self) < 0)
3968 break;
3969 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003970
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003971 case BINSTRING:
3972 if (load_binstring(self) < 0)
3973 break;
3974 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003975
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003976 case SHORT_BINSTRING:
3977 if (load_short_binstring(self) < 0)
3978 break;
3979 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003981 case STRING:
3982 if (load_string(self) < 0)
3983 break;
3984 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003985
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003986#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003987 case UNICODE:
3988 if (load_unicode(self) < 0)
3989 break;
3990 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003991
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003992 case BINUNICODE:
3993 if (load_binunicode(self) < 0)
3994 break;
3995 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003996#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003997
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003998 case EMPTY_TUPLE:
3999 if (load_empty_tuple(self) < 0)
4000 break;
4001 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004002
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004003 case TUPLE:
4004 if (load_tuple(self) < 0)
4005 break;
4006 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004007
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004008 case EMPTY_LIST:
4009 if (load_empty_list(self) < 0)
4010 break;
4011 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004012
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004013 case LIST:
4014 if (load_list(self) < 0)
4015 break;
4016 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004017
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004018 case EMPTY_DICT:
4019 if (load_empty_dict(self) < 0)
4020 break;
4021 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004023 case DICT:
4024 if (load_dict(self) < 0)
4025 break;
4026 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004027
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004028 case OBJ:
4029 if (load_obj(self) < 0)
4030 break;
4031 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004032
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004033 case INST:
4034 if (load_inst(self) < 0)
4035 break;
4036 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004037
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004038 case GLOBAL:
4039 if (load_global(self) < 0)
4040 break;
4041 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004042
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004043 case APPEND:
4044 if (load_append(self) < 0)
4045 break;
4046 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004047
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004048 case APPENDS:
4049 if (load_appends(self) < 0)
4050 break;
4051 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004052
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004053 case BUILD:
4054 if (load_build(self) < 0)
4055 break;
4056 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004058 case DUP:
4059 if (load_dup(self) < 0)
4060 break;
4061 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004062
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004063 case BINGET:
4064 if (load_binget(self) < 0)
4065 break;
4066 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004067
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004068 case LONG_BINGET:
4069 if (load_long_binget(self) < 0)
4070 break;
4071 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004073 case GET:
4074 if (load_get(self) < 0)
4075 break;
4076 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004077
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004078 case MARK:
4079 if (load_mark(self) < 0)
4080 break;
4081 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004083 case BINPUT:
4084 if (load_binput(self) < 0)
4085 break;
4086 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004088 case LONG_BINPUT:
4089 if (load_long_binput(self) < 0)
4090 break;
4091 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004092
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004093 case PUT:
4094 if (load_put(self) < 0)
4095 break;
4096 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004097
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004098 case POP:
4099 if (load_pop(self) < 0)
4100 break;
4101 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004103 case POP_MARK:
4104 if (load_pop_mark(self) < 0)
4105 break;
4106 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004107
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004108 case SETITEM:
4109 if (load_setitem(self) < 0)
4110 break;
4111 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004112
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004113 case SETITEMS:
4114 if (load_setitems(self) < 0)
4115 break;
4116 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004117
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004118 case STOP:
4119 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004121 case PERSID:
4122 if (load_persid(self) < 0)
4123 break;
4124 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004125
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004126 case BINPERSID:
4127 if (load_binpersid(self) < 0)
4128 break;
4129 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004131 case REDUCE:
4132 if (load_reduce(self) < 0)
4133 break;
4134 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004135
Tim Peters4190fb82003-02-02 16:09:05 +00004136 case PROTO:
4137 if (load_proto(self) < 0)
4138 break;
4139 continue;
4140
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004141 case '\0':
4142 /* end of file */
4143 PyErr_SetNone(PyExc_EOFError);
4144 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004145
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004146 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004147 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004148 "invalid load key, '%s'.",
4149 "c", s[0]);
4150 return NULL;
4151 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004153 break;
4154 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004155
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004156 if ((err = PyErr_Occurred())) {
4157 if (err == PyExc_EOFError) {
4158 PyErr_SetNone(PyExc_EOFError);
4159 }
4160 return NULL;
4161 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004163 PDATA_POP(self->stack, val);
4164 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004165}
Tim Peters84e87f32001-03-17 04:50:51 +00004166
Guido van Rossum60456fd1997-04-09 17:36:32 +00004167
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004168/* No-load functions to support noload, which is used to
4169 find persistent references. */
4170
4171static int
Tim Peterscba30e22003-02-01 06:24:36 +00004172noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004173{
4174 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004175
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004176 if ((i = marker(self)) < 0) return -1;
4177 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004178}
4179
4180
4181static int
Tim Peterscba30e22003-02-01 06:24:36 +00004182noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004183{
4184 int i;
4185 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004186
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004187 if ((i = marker(self)) < 0) return -1;
4188 Pdata_clear(self->stack, i);
4189 if ((*self->readline_func)(self, &s) < 0) return -1;
4190 if ((*self->readline_func)(self, &s) < 0) return -1;
4191 PDATA_APPEND(self->stack, Py_None,-1);
4192 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004193}
4194
4195static int
Tim Peterscba30e22003-02-01 06:24:36 +00004196noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004197{
4198 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004200 if ((*self->readline_func)(self, &s) < 0) return -1;
4201 if ((*self->readline_func)(self, &s) < 0) return -1;
4202 PDATA_APPEND(self->stack, Py_None,-1);
4203 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004204}
4205
4206static int
Tim Peterscba30e22003-02-01 06:24:36 +00004207noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004208{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004209
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004210 if (self->stack->length < 2) return stackUnderflow();
4211 Pdata_clear(self->stack, self->stack->length-2);
4212 PDATA_APPEND(self->stack, Py_None,-1);
4213 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004214}
4215
4216static int
4217noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004218
Guido van Rossum053b8df1998-11-25 16:18:00 +00004219 if (self->stack->length < 1) return stackUnderflow();
4220 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004221 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004222}
4223
4224
4225static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004226noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004227{
4228 PyObject *err = 0, *val = 0;
4229 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004230
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004231 self->num_marks = 0;
4232 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004234 while (1) {
4235 if ((*self->read_func)(self, &s, 1) < 0)
4236 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004237
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004238 switch (s[0]) {
4239 case NONE:
4240 if (load_none(self) < 0)
4241 break;
4242 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004243
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004244 case BININT:
4245 if (load_binint(self) < 0)
4246 break;
4247 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004248
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004249 case BININT1:
4250 if (load_binint1(self) < 0)
4251 break;
4252 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004253
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004254 case BININT2:
4255 if (load_binint2(self) < 0)
4256 break;
4257 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004259 case INT:
4260 if (load_int(self) < 0)
4261 break;
4262 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004263
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004264 case LONG:
4265 if (load_long(self) < 0)
4266 break;
4267 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004268
Tim Peters4190fb82003-02-02 16:09:05 +00004269 case LONG1:
4270 if (load_counted_long(self, 1) < 0)
4271 break;
4272 continue;
4273
4274 case LONG4:
4275 if (load_counted_long(self, 4) < 0)
4276 break;
4277 continue;
4278
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004279 case FLOAT:
4280 if (load_float(self) < 0)
4281 break;
4282 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004284 case BINFLOAT:
4285 if (load_binfloat(self) < 0)
4286 break;
4287 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004289 case BINSTRING:
4290 if (load_binstring(self) < 0)
4291 break;
4292 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004294 case SHORT_BINSTRING:
4295 if (load_short_binstring(self) < 0)
4296 break;
4297 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004298
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004299 case STRING:
4300 if (load_string(self) < 0)
4301 break;
4302 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004303
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004304#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004305 case UNICODE:
4306 if (load_unicode(self) < 0)
4307 break;
4308 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004309
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004310 case BINUNICODE:
4311 if (load_binunicode(self) < 0)
4312 break;
4313 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004314#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004315
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004316 case EMPTY_TUPLE:
4317 if (load_empty_tuple(self) < 0)
4318 break;
4319 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004320
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004321 case TUPLE:
4322 if (load_tuple(self) < 0)
4323 break;
4324 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004326 case EMPTY_LIST:
4327 if (load_empty_list(self) < 0)
4328 break;
4329 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004331 case LIST:
4332 if (load_list(self) < 0)
4333 break;
4334 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004336 case EMPTY_DICT:
4337 if (load_empty_dict(self) < 0)
4338 break;
4339 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004341 case DICT:
4342 if (load_dict(self) < 0)
4343 break;
4344 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004345
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004346 case OBJ:
4347 if (noload_obj(self) < 0)
4348 break;
4349 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004350
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004351 case INST:
4352 if (noload_inst(self) < 0)
4353 break;
4354 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004355
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004356 case GLOBAL:
4357 if (noload_global(self) < 0)
4358 break;
4359 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004361 case APPEND:
4362 if (load_append(self) < 0)
4363 break;
4364 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004365
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004366 case APPENDS:
4367 if (load_appends(self) < 0)
4368 break;
4369 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004371 case BUILD:
4372 if (noload_build(self) < 0)
4373 break;
4374 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004375
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004376 case DUP:
4377 if (load_dup(self) < 0)
4378 break;
4379 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004381 case BINGET:
4382 if (load_binget(self) < 0)
4383 break;
4384 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004386 case LONG_BINGET:
4387 if (load_long_binget(self) < 0)
4388 break;
4389 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004391 case GET:
4392 if (load_get(self) < 0)
4393 break;
4394 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004396 case MARK:
4397 if (load_mark(self) < 0)
4398 break;
4399 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004401 case BINPUT:
4402 if (load_binput(self) < 0)
4403 break;
4404 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004406 case LONG_BINPUT:
4407 if (load_long_binput(self) < 0)
4408 break;
4409 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004411 case PUT:
4412 if (load_put(self) < 0)
4413 break;
4414 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004415
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004416 case POP:
4417 if (load_pop(self) < 0)
4418 break;
4419 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004421 case POP_MARK:
4422 if (load_pop_mark(self) < 0)
4423 break;
4424 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004425
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004426 case SETITEM:
4427 if (load_setitem(self) < 0)
4428 break;
4429 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004430
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004431 case SETITEMS:
4432 if (load_setitems(self) < 0)
4433 break;
4434 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004436 case STOP:
4437 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004439 case PERSID:
4440 if (load_persid(self) < 0)
4441 break;
4442 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004443
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004444 case BINPERSID:
4445 if (load_binpersid(self) < 0)
4446 break;
4447 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004448
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004449 case REDUCE:
4450 if (noload_reduce(self) < 0)
4451 break;
4452 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004453
Tim Peters4190fb82003-02-02 16:09:05 +00004454 case PROTO:
4455 if (load_proto(self) < 0)
4456 break;
4457 continue;
4458
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004459 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004460 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004461 "invalid load key, '%s'.",
4462 "c", s[0]);
4463 return NULL;
4464 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004466 break;
4467 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004468
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004469 if ((err = PyErr_Occurred())) {
4470 if (err == PyExc_EOFError) {
4471 PyErr_SetNone(PyExc_EOFError);
4472 }
4473 return NULL;
4474 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004476 PDATA_POP(self->stack, val);
4477 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004478}
Tim Peters84e87f32001-03-17 04:50:51 +00004479
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004480
Guido van Rossum60456fd1997-04-09 17:36:32 +00004481static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004482Unpickler_load(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004483{
Tim Peterscba30e22003-02-01 06:24:36 +00004484 if (!( PyArg_ParseTuple(args, ":load")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004485 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004487 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004488}
4489
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004490static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004491Unpickler_noload(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004492{
Tim Peterscba30e22003-02-01 06:24:36 +00004493 if (!( PyArg_ParseTuple(args, ":noload")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004494 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004496 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004497}
4498
Guido van Rossum60456fd1997-04-09 17:36:32 +00004499
4500static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004501 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004502 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004503 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004504 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004505 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004506 "noload() -- not load a pickle, but go through most of the motions\n"
4507 "\n"
4508 "This function can be used to read past a pickle without instantiating\n"
4509 "any objects or importing any modules. It can also be used to find all\n"
4510 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004511 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004512 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004513 {NULL, NULL} /* sentinel */
4514};
4515
4516
4517static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004518newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004519{
4520 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004521
Tim Peterscba30e22003-02-01 06:24:36 +00004522 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
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 self->file = NULL;
4526 self->arg = NULL;
4527 self->stack = (Pdata*)Pdata_New();
4528 self->pers_func = NULL;
4529 self->last_string = NULL;
4530 self->marks = NULL;
4531 self->num_marks = 0;
4532 self->marks_size = 0;
4533 self->buf_size = 0;
4534 self->read = NULL;
4535 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004536 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004537
Tim Peterscba30e22003-02-01 06:24:36 +00004538 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004539 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004540
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004541 Py_INCREF(f);
4542 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004544 /* Set read, readline based on type of f */
4545 if (PyFile_Check(f)) {
4546 self->fp = PyFile_AsFile(f);
4547 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00004548 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004549 "I/O operation on closed file");
4550 goto err;
4551 }
4552 self->read_func = read_file;
4553 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004554 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004555 else if (PycStringIO_InputCheck(f)) {
4556 self->fp = NULL;
4557 self->read_func = read_cStringIO;
4558 self->readline_func = readline_cStringIO;
4559 }
4560 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004562 self->fp = NULL;
4563 self->read_func = read_other;
4564 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004566 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4567 (self->read = PyObject_GetAttr(f, read_str)))) {
4568 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00004569 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004570 "argument must have 'read' and "
4571 "'readline' attributes" );
4572 goto err;
4573 }
4574 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004576 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004577
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004578 err:
4579 Py_DECREF((PyObject *)self);
4580 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004581}
4582
4583
4584static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004585get_Unpickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004586{
4587 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004588
Tim Peterscba30e22003-02-01 06:24:36 +00004589 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004590 return NULL;
4591 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004592}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004593
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004594
Guido van Rossum60456fd1997-04-09 17:36:32 +00004595static void
Tim Peterscba30e22003-02-01 06:24:36 +00004596Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004597{
4598 Py_XDECREF(self->readline);
4599 Py_XDECREF(self->read);
4600 Py_XDECREF(self->file);
4601 Py_XDECREF(self->memo);
4602 Py_XDECREF(self->stack);
4603 Py_XDECREF(self->pers_func);
4604 Py_XDECREF(self->arg);
4605 Py_XDECREF(self->last_string);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004607 if (self->marks) {
4608 free(self->marks);
4609 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004611 if (self->buf_size) {
4612 free(self->buf);
4613 }
Tim Peters84e87f32001-03-17 04:50:51 +00004614
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004615 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004616}
4617
4618
4619static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004620Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004621{
4622 if (!strcmp(name, "persistent_load")) {
4623 if (!self->pers_func) {
4624 PyErr_SetString(PyExc_AttributeError, name);
4625 return NULL;
4626 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004628 Py_INCREF(self->pers_func);
4629 return self->pers_func;
4630 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004631
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004632 if (!strcmp(name, "find_global")) {
4633 if (!self->find_class) {
4634 PyErr_SetString(PyExc_AttributeError, name);
4635 return NULL;
4636 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004637
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004638 Py_INCREF(self->find_class);
4639 return self->find_class;
4640 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004641
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004642 if (!strcmp(name, "memo")) {
4643 if (!self->memo) {
4644 PyErr_SetString(PyExc_AttributeError, name);
4645 return NULL;
4646 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004648 Py_INCREF(self->memo);
4649 return self->memo;
4650 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004651
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004652 if (!strcmp(name, "UnpicklingError")) {
4653 Py_INCREF(UnpicklingError);
4654 return UnpicklingError;
4655 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004657 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004658}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004659
Guido van Rossum60456fd1997-04-09 17:36:32 +00004660
4661static int
Tim Peterscba30e22003-02-01 06:24:36 +00004662Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004663{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004665 if (!strcmp(name, "persistent_load")) {
4666 Py_XDECREF(self->pers_func);
4667 self->pers_func = value;
4668 Py_XINCREF(value);
4669 return 0;
4670 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004672 if (!strcmp(name, "find_global")) {
4673 Py_XDECREF(self->find_class);
4674 self->find_class = value;
4675 Py_XINCREF(value);
4676 return 0;
4677 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004678
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004679 if (! value) {
4680 PyErr_SetString(PyExc_TypeError,
4681 "attribute deletion is not supported");
4682 return -1;
4683 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004685 if (strcmp(name, "memo") == 0) {
4686 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00004687 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004688 "memo must be a dictionary");
4689 return -1;
4690 }
4691 Py_XDECREF(self->memo);
4692 self->memo = value;
4693 Py_INCREF(value);
4694 return 0;
4695 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004696
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004697 PyErr_SetString(PyExc_AttributeError, name);
4698 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004699}
4700
Tim Peters5bd2a792003-02-01 16:45:06 +00004701/* ---------------------------------------------------------------------------
4702 * Module-level functions.
4703 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004704
Tim Peters5bd2a792003-02-01 16:45:06 +00004705/* dump(obj, file, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004706static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004707cpm_dump(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004708{
4709 PyObject *ob, *file, *res = NULL;
4710 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00004711 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004712
Tim Peters5bd2a792003-02-01 16:45:06 +00004713 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004714 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004715
Tim Peters5bd2a792003-02-01 16:45:06 +00004716 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004717 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004718
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004719 if (dump(pickler, ob) < 0)
4720 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004722 Py_INCREF(Py_None);
4723 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004724
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004725 finally:
4726 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004727
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004728 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004729}
4730
4731
Tim Peters5bd2a792003-02-01 16:45:06 +00004732/* dumps(obj, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004733static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004734cpm_dumps(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004735{
4736 PyObject *ob, *file = 0, *res = NULL;
4737 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00004738 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004739
Tim Peters5bd2a792003-02-01 16:45:06 +00004740 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004741 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004742
Tim Peterscba30e22003-02-01 06:24:36 +00004743 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004744 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004745
Tim Peters5bd2a792003-02-01 16:45:06 +00004746 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004747 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004749 if (dump(pickler, ob) < 0)
4750 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004752 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004754 finally:
4755 Py_XDECREF(pickler);
4756 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004758 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004759}
4760
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004761
Tim Peters5bd2a792003-02-01 16:45:06 +00004762/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004763static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004764cpm_load(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004765{
4766 Unpicklerobject *unpickler = 0;
4767 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004768
Tim Peterscba30e22003-02-01 06:24:36 +00004769 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004770 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004771
Tim Peterscba30e22003-02-01 06:24:36 +00004772 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004773 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004775 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004777 finally:
4778 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004780 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004781}
4782
4783
Tim Peters5bd2a792003-02-01 16:45:06 +00004784/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004785static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004786cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004787{
4788 PyObject *ob, *file = 0, *res = NULL;
4789 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004790
Tim Peterscba30e22003-02-01 06:24:36 +00004791 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004792 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004793
Tim Peterscba30e22003-02-01 06:24:36 +00004794 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004795 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004796
Tim Peterscba30e22003-02-01 06:24:36 +00004797 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004798 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004799
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004800 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004802 finally:
4803 Py_XDECREF(file);
4804 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004806 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004807}
4808
4809
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004810PyDoc_STRVAR(Unpicklertype__doc__,
4811"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004812
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004813static PyTypeObject Unpicklertype = {
4814 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004815 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004816 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004817 sizeof(Unpicklerobject), /*tp_basicsize*/
4818 0, /*tp_itemsize*/
4819 /* methods */
4820 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4821 (printfunc)0, /*tp_print*/
4822 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4823 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4824 (cmpfunc)0, /*tp_compare*/
4825 (reprfunc)0, /*tp_repr*/
4826 0, /*tp_as_number*/
4827 0, /*tp_as_sequence*/
4828 0, /*tp_as_mapping*/
4829 (hashfunc)0, /*tp_hash*/
4830 (ternaryfunc)0, /*tp_call*/
4831 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004832
Guido van Rossum60456fd1997-04-09 17:36:32 +00004833 /* Space for future expansion */
4834 0L,0L,0L,0L,
4835 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004836};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004837
Guido van Rossum60456fd1997-04-09 17:36:32 +00004838static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004839 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004840 PyDoc_STR("dump(object, file, proto=0) -- "
4841 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004842 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00004843 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004844 },
Tim Peters5bd2a792003-02-01 16:45:06 +00004845
Neal Norwitzb0493252002-03-31 14:44:22 +00004846 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004847 PyDoc_STR("dumps(object, proto=0) -- "
4848 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004849 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00004850 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004851 },
Tim Peters5bd2a792003-02-01 16:45:06 +00004852
Neal Norwitzb0493252002-03-31 14:44:22 +00004853 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004854 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00004855
Neal Norwitzb0493252002-03-31 14:44:22 +00004856 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004857 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00004858
Neal Norwitzb0493252002-03-31 14:44:22 +00004859 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004860 PyDoc_STR("Pickler(file, proto=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004861 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00004862 "This takes a file-like object for writing a pickle data stream.\n"
4863 "The optional proto argument tells the pickler to use the given\n"
4864 "protocol; supported protocols are 0, 1, 2. The default\n"
4865 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
4866 "only protocol that can be written to a file opened in text\n"
4867 "mode and read back successfully. When using a protocol higher\n"
4868 "than 0, make sure the file is opened in binary mode, both when\n"
4869 "pickling and unpickling.)\n"
4870 "\n"
4871 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
4872 "more efficient than protocol 1.\n"
4873 "\n"
4874 "Specifying a negative protocol version selects the highest\n"
4875 "protocol version supported. The higher the protocol used, the\n"
4876 "more recent the version of Python needed to read the pickle\n"
4877 "produced.\n"
4878 "\n"
4879 "The file parameter must have a write() method that accepts a single\n"
4880 "string argument. It can thus be an open file object, a StringIO\n"
4881 "object, or any other custom object that meets this interface.\n")
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 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004885 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
4886
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004887 { NULL, NULL }
4888};
4889
Guido van Rossum60456fd1997-04-09 17:36:32 +00004890static int
Tim Peterscba30e22003-02-01 06:24:36 +00004891init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004892{
4893 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004894
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00004895#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004897 INIT_STR(__class__);
4898 INIT_STR(__getinitargs__);
4899 INIT_STR(__dict__);
4900 INIT_STR(__getstate__);
4901 INIT_STR(__setstate__);
4902 INIT_STR(__name__);
4903 INIT_STR(__main__);
4904 INIT_STR(__reduce__);
4905 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004906 INIT_STR(append);
4907 INIT_STR(read);
4908 INIT_STR(readline);
4909 INIT_STR(copy_reg);
4910 INIT_STR(dispatch_table);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004911 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004912
Tim Peterscba30e22003-02-01 06:24:36 +00004913 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004914 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004915
Tim Peters1f1b2d22003-02-01 02:16:37 +00004916 /* This is special because we want to use a different
4917 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004918 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peterscba30e22003-02-01 06:24:36 +00004919 if (!dispatch_table)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004920 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004921
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004922 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004923
Tim Peterscba30e22003-02-01 06:24:36 +00004924 if (!( empty_tuple = PyTuple_New(0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004925 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004926
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004927 /* Ugh */
4928 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
4929 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4930 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004931
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004932 if (!( t=PyDict_New())) return -1;
4933 if (!( r=PyRun_String(
4934 "def __init__(self, *args): self.args=args\n\n"
4935 "def __str__(self):\n"
4936 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4937 Py_file_input,
4938 module_dict, t) )) return -1;
4939 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004941 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00004942 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004943 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004945 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004946
Tim Peterscba30e22003-02-01 06:24:36 +00004947 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004948 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00004949 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004950 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004951
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004952 if (!( t=PyDict_New())) return -1;
4953 if (!( r=PyRun_String(
4954 "def __init__(self, *args): self.args=args\n\n"
4955 "def __str__(self):\n"
4956 " a=self.args\n"
4957 " a=a and type(a[0]) or '(what)'\n"
4958 " return 'Cannot pickle %s objects' % a\n"
4959 , Py_file_input,
4960 module_dict, t) )) return -1;
4961 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00004962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004963 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00004964 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004965 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004967 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004968
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004969 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00004970 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004971 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004972
Martin v. Löwis658009a2002-09-16 17:26:24 +00004973 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
4974 UnpicklingError, NULL)))
4975 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00004976
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004977 if (PyDict_SetItemString(module_dict, "PickleError",
4978 PickleError) < 0)
4979 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004981 if (PyDict_SetItemString(module_dict, "PicklingError",
4982 PicklingError) < 0)
4983 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004984
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004985 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4986 UnpicklingError) < 0)
4987 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004988
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004989 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4990 UnpickleableError) < 0)
4991 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004992
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004993 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4994 BadPickleGet) < 0)
4995 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004996
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004997 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004998
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004999 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005000}
5001
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005002#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5003#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005004#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005005PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005006initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005007{
5008 PyObject *m, *d, *di, *v, *k;
5009 int i;
5010 char *rev="1.71";
5011 PyObject *format_version;
5012 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005014 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005015 Unpicklertype.ob_type = &PyType_Type;
5016 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005017
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005018 /* Initialize some pieces. We need to do this before module creation,
5019 so we're forced to use a temporary dictionary. :(
5020 */
5021 di=PyDict_New();
5022 if (!di) return;
5023 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005024
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005025 /* Create the module and add the functions */
5026 m = Py_InitModule4("cPickle", cPickle_methods,
5027 cPickle_module_documentation,
5028 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005029
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005030 /* Add some symbolic constants to the module */
5031 d = PyModule_GetDict(m);
5032 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
5033 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005034
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005035 /* Copy data from di. Waaa. */
5036 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5037 if (PyObject_SetItem(d, k, v) < 0) {
5038 Py_DECREF(di);
5039 return;
5040 }
5041 }
5042 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005043
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005044 format_version = PyString_FromString("1.3");
5045 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005046
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005047 PyDict_SetItemString(d, "format_version", format_version);
5048 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5049 Py_XDECREF(format_version);
5050 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005051}