blob: 31a59f2a0fb683b1483e5c1cafc5bae4ced2db93 [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;
Tim Peters87482ea2003-02-02 16:16:30 +00002220 assert(self->proto >= 0 && self->proto < 256);
2221 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002222 if (self->write_func(self, bytes, 2) < 0)
2223 return -1;
2224 }
2225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002226 if (save(self, args, 0) < 0)
2227 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002228
Tim Peters4190fb82003-02-02 16:09:05 +00002229 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002230 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002231
Tim Peters4190fb82003-02-02 16:09:05 +00002232 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002233 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002235 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002236}
2237
2238static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002239Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002240{
Tim Peterscba30e22003-02-01 06:24:36 +00002241 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002242 PyDict_Clear(self->memo);
2243 Py_INCREF(Py_None);
2244 return Py_None;
2245}
2246
2247static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002248Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002249{
2250 int l, i, rsize, ssize, clear=1, lm;
2251 long ik;
2252 PyObject *k, *r;
2253 char *s, *p, *have_get;
2254 Pdata *data;
2255
2256 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002257 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002258 return NULL;
2259
2260 /* Check to make sure we are based on a list */
2261 if (! Pdata_Check(self->file)) {
2262 PyErr_SetString(PicklingError,
2263 "Attempt to getvalue() a non-list-based pickler");
2264 return NULL;
2265 }
2266
2267 /* flush write buffer */
2268 if (write_other(self, NULL, 0) < 0) return NULL;
2269
2270 data=(Pdata*)self->file;
2271 l=data->length;
2272
2273 /* set up an array to hold get/put status */
2274 if ((lm=PyDict_Size(self->memo)) < 0) return NULL;
2275 lm++;
2276 if (! (have_get=malloc((lm)*sizeof(char)))) return PyErr_NoMemory();
2277 memset(have_get,0,lm);
2278
2279 /* Scan for gets. */
2280 for (rsize=0, i=l; --i >= 0; ) {
2281 k=data->data[i];
2282
2283 if (PyString_Check(k)) {
2284 rsize += PyString_GET_SIZE(k);
2285 }
2286
2287 else if (PyInt_Check(k)) { /* put */
2288 ik=PyInt_AS_LONG((PyIntObject*)k);
2289 if (ik >= lm || ik==0) {
2290 PyErr_SetString(PicklingError,
2291 "Invalid get data");
2292 return NULL;
2293 }
2294 if (have_get[ik]) { /* with matching get */
2295 if (ik < 256) rsize += 2;
2296 else rsize+=5;
2297 }
2298 }
2299
2300 else if (! (PyTuple_Check(k) &&
2301 PyTuple_GET_SIZE(k) == 2 &&
2302 PyInt_Check((k=PyTuple_GET_ITEM(k,0))))
2303 ) {
2304 PyErr_SetString(PicklingError,
2305 "Unexpected data in internal list");
2306 return NULL;
2307 }
2308
2309 else { /* put */
2310 ik=PyInt_AS_LONG((PyIntObject*)k);
2311 if (ik >= lm || ik==0) {
2312 PyErr_SetString(PicklingError,
2313 "Invalid get data");
2314 return NULL;
2315 }
2316 have_get[ik]=1;
2317 if (ik < 256) rsize += 2;
2318 else rsize+=5;
2319 }
2320
2321 }
2322
2323 /* Now generate the result */
2324 if (!( r=PyString_FromStringAndSize(NULL,rsize))) goto err;
2325 s=PyString_AS_STRING((PyStringObject*)r);
2326
2327 for (i=0; i<l; i++) {
2328 k=data->data[i];
2329
2330 if (PyString_Check(k)) {
2331 ssize=PyString_GET_SIZE(k);
2332 if (ssize) {
2333 p=PyString_AS_STRING((PyStringObject*)k);
2334 while (--ssize >= 0) *s++=*p++;
2335 }
2336 }
2337
2338 else if (PyTuple_Check(k)) { /* get */
2339 ik=PyInt_AS_LONG((PyIntObject*)PyTuple_GET_ITEM(k,0));
2340 if (ik < 256) {
2341 *s++ = BINGET;
2342 *s++ = (int)(ik & 0xff);
2343 }
2344 else {
2345 *s++ = LONG_BINGET;
2346 *s++ = (int)(ik & 0xff);
2347 *s++ = (int)((ik >> 8) & 0xff);
2348 *s++ = (int)((ik >> 16) & 0xff);
2349 *s++ = (int)((ik >> 24) & 0xff);
2350 }
2351 }
2352
2353 else { /* put */
2354 ik=PyInt_AS_LONG((PyIntObject*)k);
2355
2356 if (have_get[ik]) { /* with matching get */
2357 if (ik < 256) {
2358 *s++ = BINPUT;
2359 *s++ = (int)(ik & 0xff);
2360 }
2361 else {
2362 *s++ = LONG_BINPUT;
2363 *s++ = (int)(ik & 0xff);
2364 *s++ = (int)((ik >> 8) & 0xff);
2365 *s++ = (int)((ik >> 16) & 0xff);
2366 *s++ = (int)((ik >> 24) & 0xff);
2367 }
2368 }
2369 }
2370
2371 }
2372
2373 if (clear) {
2374 PyDict_Clear(self->memo);
2375 Pdata_clear(data,0);
2376 }
2377
2378 free(have_get);
2379 return r;
2380 err:
2381 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002382 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002383}
2384
2385static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002386Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002387{
2388 PyObject *ob;
2389 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002390
Tim Peterscba30e22003-02-01 06:24:36 +00002391 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002392 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002393
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002394 if (dump(self, ob) < 0)
2395 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002397 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002399 /* XXX Why does dump() return self? */
2400 Py_INCREF(self);
2401 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002402}
2403
2404
Tim Peterscba30e22003-02-01 06:24:36 +00002405static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002406{
Neal Norwitzb0493252002-03-31 14:44:22 +00002407 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002408 PyDoc_STR("dump(object) -- "
2409 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002410 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002411 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002412 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002413 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002414 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002415};
2416
2417
2418static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002419newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002420{
2421 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002422
Tim Peters5bd2a792003-02-01 16:45:06 +00002423 if (proto < 0)
2424 proto = CURRENT_PROTOCOL_NUMBER;
2425 if (proto > CURRENT_PROTOCOL_NUMBER) {
2426 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2427 "the highest available protocol is %d",
2428 proto, CURRENT_PROTOCOL_NUMBER);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002429 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002430 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002431
Tim Peters5bd2a792003-02-01 16:45:06 +00002432 self = PyObject_New(Picklerobject, &Picklertype);
2433 if (self == NULL)
2434 return NULL;
2435 self->proto = proto;
2436 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002437 self->fp = NULL;
2438 self->write = NULL;
2439 self->memo = NULL;
2440 self->arg = NULL;
2441 self->pers_func = NULL;
2442 self->inst_pers_func = NULL;
2443 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002444 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002445 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002446 self->fast_container = 0;
2447 self->fast_memo = NULL;
2448 self->buf_size = 0;
2449 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002450
Tim Peters5bd2a792003-02-01 16:45:06 +00002451 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002452 if (file)
2453 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002454 else {
2455 file = Pdata_New();
2456 if (file == NULL)
2457 goto err;
2458 }
2459 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002460
Tim Peterscba30e22003-02-01 06:24:36 +00002461 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002462 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002464 if (PyFile_Check(file)) {
2465 self->fp = PyFile_AsFile(file);
2466 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002467 PyErr_SetString(PyExc_ValueError,
2468 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002469 goto err;
2470 }
2471 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002472 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002473 else if (PycStringIO_OutputCheck(file)) {
2474 self->write_func = write_cStringIO;
2475 }
2476 else if (file == Py_None) {
2477 self->write_func = write_none;
2478 }
2479 else {
2480 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002481
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002482 if (! Pdata_Check(file)) {
2483 self->write = PyObject_GetAttr(file, write_str);
2484 if (!self->write) {
2485 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002486 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002487 "argument must have 'write' "
2488 "attribute");
2489 goto err;
2490 }
2491 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002492
Tim Peters5bd2a792003-02-01 16:45:06 +00002493 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2494 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002495 PyErr_NoMemory();
2496 goto err;
2497 }
2498 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002499
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002500 if (PyEval_GetRestricted()) {
2501 /* Restricted execution, get private tables */
2502 PyObject *m;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002503
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002504 if (!( m=PyImport_Import(copy_reg_str))) goto err;
2505 self->dispatch_table=PyObject_GetAttr(m, dispatch_table_str);
2506 Py_DECREF(m);
2507 if (!( self->dispatch_table )) goto err;
2508 }
2509 else {
2510 self->dispatch_table=dispatch_table;
2511 Py_INCREF(dispatch_table);
2512 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002513
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002514 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002516 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002517 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002518 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002519}
2520
2521
2522static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002523get_Pickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002524{
2525 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002526 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002527
Tim Peters5bd2a792003-02-01 16:45:06 +00002528 /* XXX What is this doing? The documented signature is
2529 * XXX Pickler(file, proto=0), but this accepts Pickler() and
2530 * XXX Pickler(integer) too. The meaning then is clear as mud.
2531 * XXX Bug? Feature?
2532 */
2533 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002534 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002535 proto = 0;
2536 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002537 return NULL;
2538 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002539 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002540}
2541
2542
2543static void
Tim Peterscba30e22003-02-01 06:24:36 +00002544Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002545{
2546 Py_XDECREF(self->write);
2547 Py_XDECREF(self->memo);
2548 Py_XDECREF(self->fast_memo);
2549 Py_XDECREF(self->arg);
2550 Py_XDECREF(self->file);
2551 Py_XDECREF(self->pers_func);
2552 Py_XDECREF(self->inst_pers_func);
2553 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002554 PyMem_Free(self->write_buf);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002555 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002556}
2557
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002558static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002559Pickler_get_pers_func(Picklerobject *p)
2560{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002561 if (p->pers_func == NULL)
2562 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2563 else
2564 Py_INCREF(p->pers_func);
2565 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002566}
2567
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002568static int
2569Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2570{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002571 if (v == NULL) {
2572 PyErr_SetString(PyExc_TypeError,
2573 "attribute deletion is not supported");
2574 return -1;
2575 }
2576 Py_XDECREF(p->pers_func);
2577 Py_INCREF(v);
2578 p->pers_func = v;
2579 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002580}
2581
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002582static int
2583Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2584{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002585 if (v == NULL) {
2586 PyErr_SetString(PyExc_TypeError,
2587 "attribute deletion is not supported");
2588 return -1;
2589 }
2590 Py_XDECREF(p->inst_pers_func);
2591 Py_INCREF(v);
2592 p->inst_pers_func = v;
2593 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002594}
2595
2596static PyObject *
2597Pickler_get_memo(Picklerobject *p)
2598{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002599 if (p->memo == NULL)
2600 PyErr_SetString(PyExc_AttributeError, "memo");
2601 else
2602 Py_INCREF(p->memo);
2603 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002604}
2605
2606static int
2607Pickler_set_memo(Picklerobject *p, PyObject *v)
2608{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002609 if (v == NULL) {
2610 PyErr_SetString(PyExc_TypeError,
2611 "attribute deletion is not supported");
2612 return -1;
2613 }
2614 if (!PyDict_Check(v)) {
2615 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2616 return -1;
2617 }
2618 Py_XDECREF(p->memo);
2619 Py_INCREF(v);
2620 p->memo = v;
2621 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002622}
2623
2624static PyObject *
2625Pickler_get_error(Picklerobject *p)
2626{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002627 /* why is this an attribute on the Pickler? */
2628 Py_INCREF(PicklingError);
2629 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002630}
2631
2632static PyMemberDef Pickler_members[] = {
2633 {"binary", T_INT, offsetof(Picklerobject, bin)},
2634 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002635 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002636};
2637
2638static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002639 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002640 (setter)Pickler_set_pers_func},
2641 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2642 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002643 {"PicklingError", (getter)Pickler_get_error, NULL},
2644 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002645};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002646
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002647PyDoc_STRVAR(Picklertype__doc__,
2648"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002649
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002650static PyTypeObject Picklertype = {
2651 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002652 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002653 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002654 sizeof(Picklerobject), /*tp_basicsize*/
2655 0,
2656 (destructor)Pickler_dealloc, /* tp_dealloc */
2657 0, /* tp_print */
2658 0, /* tp_getattr */
2659 0, /* tp_setattr */
2660 0, /* tp_compare */
2661 0, /* tp_repr */
2662 0, /* tp_as_number */
2663 0, /* tp_as_sequence */
2664 0, /* tp_as_mapping */
2665 0, /* tp_hash */
2666 0, /* tp_call */
2667 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002668 PyObject_GenericGetAttr, /* tp_getattro */
2669 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002670 0, /* tp_as_buffer */
2671 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2672 Picklertype__doc__, /* tp_doc */
2673 0, /* tp_traverse */
2674 0, /* tp_clear */
2675 0, /* tp_richcompare */
2676 0, /* tp_weaklistoffset */
2677 0, /* tp_iter */
2678 0, /* tp_iternext */
2679 Pickler_methods, /* tp_methods */
2680 Pickler_members, /* tp_members */
2681 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002682};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002683
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002684static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002685find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002686{
2687 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002689 if (fc) {
2690 if (fc==Py_None) {
2691 PyErr_SetString(UnpicklingError,
2692 "Global and instance pickles are not supported.");
2693 return NULL;
2694 }
Tim Peterscba30e22003-02-01 06:24:36 +00002695 return PyObject_CallFunction(fc, "OO", py_module_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002696 py_global_name);
2697 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002698
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002699 module = PySys_GetObject("modules");
2700 if (module == NULL)
2701 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002703 module = PyDict_GetItem(module, py_module_name);
2704 if (module == NULL) {
2705 module = PyImport_Import(py_module_name);
2706 if (!module)
2707 return NULL;
2708 global = PyObject_GetAttr(module, py_global_name);
2709 Py_DECREF(module);
2710 }
2711 else
2712 global = PyObject_GetAttr(module, py_global_name);
2713 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002714}
2715
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002716static int
Tim Peterscba30e22003-02-01 06:24:36 +00002717marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002718{
2719 if (self->num_marks < 1) {
2720 PyErr_SetString(UnpicklingError, "could not find MARK");
2721 return -1;
2722 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002724 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002725}
2726
Tim Peters84e87f32001-03-17 04:50:51 +00002727
Guido van Rossum60456fd1997-04-09 17:36:32 +00002728static int
Tim Peterscba30e22003-02-01 06:24:36 +00002729load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002730{
2731 PDATA_APPEND(self->stack, Py_None, -1);
2732 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002733}
2734
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002735static int
Tim Peterscba30e22003-02-01 06:24:36 +00002736bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002737{
2738 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2739 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002740}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002741
2742static int
Tim Peterscba30e22003-02-01 06:24:36 +00002743load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002744{
2745 PyObject *py_int = 0;
2746 char *endptr, *s;
2747 int len, res = -1;
2748 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002750 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2751 if (len < 2) return bad_readline();
2752 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002754 errno = 0;
2755 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002757 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2758 /* Hm, maybe we've got something long. Let's try reading
2759 it as a Python long object. */
2760 errno = 0;
2761 py_int = PyLong_FromString(s, NULL, 0);
2762 if (py_int == NULL) {
2763 PyErr_SetString(PyExc_ValueError,
2764 "could not convert string to int");
2765 goto finally;
2766 }
2767 }
2768 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002769 if (len == 3 && (l == 0 || l == 1)) {
2770 if (!( py_int = PyBool_FromLong(l))) goto finally;
2771 }
2772 else {
2773 if (!( py_int = PyInt_FromLong(l))) goto finally;
2774 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002775 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002777 free(s);
2778 PDATA_PUSH(self->stack, py_int, -1);
2779 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002781 finally:
2782 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002784 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002785}
2786
Tim Petersee1a53c2003-02-02 02:57:53 +00002787/* s contains x bytes of a little-endian integer. Return its value as a
2788 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
2789 * int, but when x is 4 it's a signed one. This is an historical source
2790 * of x-platform bugs.
2791 */
Tim Peters84e87f32001-03-17 04:50:51 +00002792static long
Tim Petersee1a53c2003-02-02 02:57:53 +00002793calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002794{
2795 unsigned char c;
2796 int i;
2797 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002799 for (i = 0, l = 0L; i < x; i++) {
2800 c = (unsigned char)s[i];
2801 l |= (long)c << (i * 8);
2802 }
Tim Petersbfa18f72001-04-10 01:54:42 +00002803#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002804 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
2805 * is signed, so on a box with longs bigger than 4 bytes we need
2806 * to extend a BININT's sign bit to the full width.
2807 */
2808 if (x == 4 && l & (1L << 31))
2809 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00002810#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002811 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002812}
2813
2814
2815static int
Tim Peterscba30e22003-02-01 06:24:36 +00002816load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002817{
2818 PyObject *py_int = 0;
2819 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002820
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002821 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002822
Tim Peterscba30e22003-02-01 06:24:36 +00002823 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002824 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002825
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002826 PDATA_PUSH(self->stack, py_int, -1);
2827 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002828}
2829
2830
2831static int
Tim Peterscba30e22003-02-01 06:24:36 +00002832load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002833{
2834 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002835
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002836 if ((*self->read_func)(self, &s, 4) < 0)
2837 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002839 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002840}
2841
2842
2843static int
Tim Peterscba30e22003-02-01 06:24:36 +00002844load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002845{
2846 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002847
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002848 if ((*self->read_func)(self, &s, 1) < 0)
2849 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002851 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002852}
2853
2854
2855static int
Tim Peterscba30e22003-02-01 06:24:36 +00002856load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002857{
2858 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002860 if ((*self->read_func)(self, &s, 2) < 0)
2861 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002862
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002863 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002864}
Tim Peters84e87f32001-03-17 04:50:51 +00002865
Guido van Rossum60456fd1997-04-09 17:36:32 +00002866static int
Tim Peterscba30e22003-02-01 06:24:36 +00002867load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002868{
2869 PyObject *l = 0;
2870 char *end, *s;
2871 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002872
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002873 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2874 if (len < 2) return bad_readline();
2875 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002876
Tim Peterscba30e22003-02-01 06:24:36 +00002877 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002878 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002880 free(s);
2881 PDATA_PUSH(self->stack, l, -1);
2882 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002884 finally:
2885 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002886
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002887 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002888}
2889
Tim Petersee1a53c2003-02-02 02:57:53 +00002890/* 'size' bytes contain the # of bytes of little-endian 256's-complement
2891 * data following.
2892 */
2893static int
2894load_counted_long(Unpicklerobject *self, int size)
2895{
2896 int i;
2897 char *nbytes;
2898 unsigned char *pdata;
2899 PyObject *along;
2900
2901 assert(size == 1 || size == 4);
2902 i = self->read_func(self, &nbytes, size);
2903 if (i < 0) return -1;
2904
2905 size = calc_binint(nbytes, size);
2906 if (size < 0) {
2907 /* Corrupt or hostile pickle -- we never write one like
2908 * this.
2909 */
2910 PyErr_SetString(PyExc_ValueError, "LONG pickle has negative "
2911 "byte count");
2912 return -1;
2913 }
2914
2915 if (size == 0)
2916 along = PyLong_FromLong(0L);
2917 else {
2918 /* Read the raw little-endian bytes & convert. */
2919 i = self->read_func(self, &(char *)pdata, size);
2920 if (i < 0) return -1;
2921 along = _PyLong_FromByteArray(pdata, (size_t)size,
2922 1 /* little endian */, 1 /* signed */);
2923 }
2924 if (along == NULL)
2925 return -1;
2926 PDATA_PUSH(self->stack, along, -1);
2927 return 0;
2928}
Tim Peters84e87f32001-03-17 04:50:51 +00002929
Guido van Rossum60456fd1997-04-09 17:36:32 +00002930static int
Tim Peterscba30e22003-02-01 06:24:36 +00002931load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002932{
2933 PyObject *py_float = 0;
2934 char *endptr, *s;
2935 int len, res = -1;
2936 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002938 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
2939 if (len < 2) return bad_readline();
2940 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002942 errno = 0;
2943 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002945 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
2946 PyErr_SetString(PyExc_ValueError,
2947 "could not convert string to float");
2948 goto finally;
2949 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002950
Tim Peterscba30e22003-02-01 06:24:36 +00002951 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002952 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002953
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002954 free(s);
2955 PDATA_PUSH(self->stack, py_float, -1);
2956 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002958 finally:
2959 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002960
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002961 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002962}
2963
Guido van Rossum60456fd1997-04-09 17:36:32 +00002964static int
Tim Peterscba30e22003-02-01 06:24:36 +00002965load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002966{
2967 PyObject *py_float = 0;
2968 int s, e;
2969 long fhi, flo;
2970 double x;
2971 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002972
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002973 if ((*self->read_func)(self, &p, 8) < 0)
2974 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002975
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002976 /* First byte */
2977 s = (*p>>7) & 1;
2978 e = (*p & 0x7F) << 4;
2979 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002981 /* Second byte */
2982 e |= (*p>>4) & 0xF;
2983 fhi = (*p & 0xF) << 24;
2984 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002985
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002986 /* Third byte */
2987 fhi |= (*p & 0xFF) << 16;
2988 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002989
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002990 /* Fourth byte */
2991 fhi |= (*p & 0xFF) << 8;
2992 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002993
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002994 /* Fifth byte */
2995 fhi |= *p & 0xFF;
2996 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002997
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002998 /* Sixth byte */
2999 flo = (*p & 0xFF) << 16;
3000 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003001
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003002 /* Seventh byte */
3003 flo |= (*p & 0xFF) << 8;
3004 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003005
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003006 /* Eighth byte */
3007 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003008
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003009 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
3010 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003011
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003012 /* XXX This sadly ignores Inf/NaN */
3013 if (e == 0)
3014 e = -1022;
3015 else {
3016 x += 1.0;
3017 e -= 1023;
3018 }
3019 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003021 if (s)
3022 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003024 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003026 PDATA_PUSH(self->stack, py_float, -1);
3027 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003028}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003029
3030static int
Tim Peterscba30e22003-02-01 06:24:36 +00003031load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003032{
3033 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003034 int len, res = -1;
3035 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003036
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003037 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3038 if (len < 2) return bad_readline();
3039 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003040
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003041
3042 /* Strip outermost quotes */
3043 while (s[len-1] <= ' ')
3044 len--;
3045 if(s[0]=='"' && s[len-1]=='"'){
3046 s[len-1] = '\0';
3047 p = s + 1 ;
3048 len -= 2;
3049 } else if(s[0]=='\'' && s[len-1]=='\''){
3050 s[len-1] = '\0';
3051 p = s + 1 ;
3052 len -= 2;
3053 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003054 goto insecure;
3055 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003056
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003057 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
3058 if (str) {
3059 PDATA_PUSH(self->stack, str, -1);
3060 res = 0;
3061 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003062 free(s);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003063 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003064
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003065 insecure:
3066 free(s);
3067 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3068 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003069}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003070
3071
3072static int
Tim Peterscba30e22003-02-01 06:24:36 +00003073load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003074{
3075 PyObject *py_string = 0;
3076 long l;
3077 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003078
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003079 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003080
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003081 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003083 if ((*self->read_func)(self, &s, l) < 0)
3084 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003085
Tim Peterscba30e22003-02-01 06:24:36 +00003086 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003087 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003089 PDATA_PUSH(self->stack, py_string, -1);
3090 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003091}
3092
3093
3094static int
Tim Peterscba30e22003-02-01 06:24:36 +00003095load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003096{
3097 PyObject *py_string = 0;
3098 unsigned char l;
3099 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003100
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003101 if ((*self->read_func)(self, &s, 1) < 0)
3102 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003103
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003104 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003105
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003106 if ((*self->read_func)(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003107
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003108 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003109
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003110 PDATA_PUSH(self->stack, py_string, -1);
3111 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003112}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003113
3114
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003115#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003116static int
Tim Peterscba30e22003-02-01 06:24:36 +00003117load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003118{
3119 PyObject *str = 0;
3120 int len, res = -1;
3121 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003123 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3124 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003125
Tim Peterscba30e22003-02-01 06:24:36 +00003126 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003127 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003129 PDATA_PUSH(self->stack, str, -1);
3130 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003132 finally:
3133 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003134}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003135#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003136
3137
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003138#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003139static int
Tim Peterscba30e22003-02-01 06:24:36 +00003140load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003141{
3142 PyObject *unicode;
3143 long l;
3144 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003145
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003146 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003148 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003149
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003150 if ((*self->read_func)(self, &s, l) < 0)
3151 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003152
Tim Peterscba30e22003-02-01 06:24:36 +00003153 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003154 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003155
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003156 PDATA_PUSH(self->stack, unicode, -1);
3157 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003158}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003159#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003160
3161
3162static int
Tim Peterscba30e22003-02-01 06:24:36 +00003163load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003164{
3165 PyObject *tup;
3166 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003168 if ((i = marker(self)) < 0) return -1;
3169 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3170 PDATA_PUSH(self->stack, tup, -1);
3171 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003172}
3173
3174static int
Tim Peterscba30e22003-02-01 06:24:36 +00003175load_empty_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003176{
3177 PyObject *tup;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003179 if (!( tup=PyTuple_New(0))) return -1;
3180 PDATA_PUSH(self->stack, tup, -1);
3181 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003182}
3183
3184static int
Tim Peterscba30e22003-02-01 06:24:36 +00003185load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003186{
3187 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003188
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003189 if (!( list=PyList_New(0))) return -1;
3190 PDATA_PUSH(self->stack, list, -1);
3191 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003192}
3193
3194static int
Tim Peterscba30e22003-02-01 06:24:36 +00003195load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003196{
3197 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003198
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003199 if (!( dict=PyDict_New())) return -1;
3200 PDATA_PUSH(self->stack, dict, -1);
3201 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003202}
3203
3204
3205static int
Tim Peterscba30e22003-02-01 06:24:36 +00003206load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003207{
3208 PyObject *list = 0;
3209 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003211 if ((i = marker(self)) < 0) return -1;
3212 if (!( list=Pdata_popList(self->stack, i))) return -1;
3213 PDATA_PUSH(self->stack, list, -1);
3214 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003215}
3216
3217static int
Tim Peterscba30e22003-02-01 06:24:36 +00003218load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003219{
3220 PyObject *dict, *key, *value;
3221 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003222
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003223 if ((i = marker(self)) < 0) return -1;
3224 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003226 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003227
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003228 for (k = i+1; k < j; k += 2) {
3229 key =self->stack->data[k-1];
3230 value=self->stack->data[k ];
3231 if (PyDict_SetItem(dict, key, value) < 0) {
3232 Py_DECREF(dict);
3233 return -1;
3234 }
3235 }
3236 Pdata_clear(self->stack, i);
3237 PDATA_PUSH(self->stack, dict, -1);
3238 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003239}
3240
3241static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003242Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003243{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003244 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003245
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003246 if (PyClass_Check(cls)) {
3247 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003248
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003249 if ((l=PyObject_Size(args)) < 0) goto err;
3250 if (!( l )) {
3251 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003252
Tim Peterscba30e22003-02-01 06:24:36 +00003253 __getinitargs__ = PyObject_GetAttr(cls,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003254 __getinitargs___str);
3255 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003256 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003257 so bypass usual construction */
3258 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003259
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003260 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003261 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003262 goto err;
3263 return inst;
3264 }
3265 Py_DECREF(__getinitargs__);
3266 }
Tim Peters84e87f32001-03-17 04:50:51 +00003267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003268 if ((r=PyInstance_New(cls, args, NULL))) return r;
3269 else goto err;
3270 }
Tim Peters84e87f32001-03-17 04:50:51 +00003271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003272 if (args==Py_None) {
3273 /* Special case, call cls.__basicnew__() */
3274 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003275
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003276 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3277 if (!basicnew) return NULL;
3278 r=PyObject_CallObject(basicnew, NULL);
3279 Py_DECREF(basicnew);
3280 if (r) return r;
3281 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003282
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003283 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003284
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003285 err:
3286 {
3287 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003289 PyErr_Fetch(&tp, &v, &tb);
3290 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3291 Py_XDECREF(v);
3292 v=r;
3293 }
3294 PyErr_Restore(tp,v,tb);
3295 }
3296 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003297}
Tim Peters84e87f32001-03-17 04:50:51 +00003298
Guido van Rossum60456fd1997-04-09 17:36:32 +00003299
3300static int
Tim Peterscba30e22003-02-01 06:24:36 +00003301load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003302{
3303 PyObject *class, *tup, *obj=0;
3304 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003306 if ((i = marker(self)) < 0) return -1;
3307 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3308 PDATA_POP(self->stack, class);
3309 if (class) {
3310 obj = Instance_New(class, tup);
3311 Py_DECREF(class);
3312 }
3313 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003314
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003315 if (! obj) return -1;
3316 PDATA_PUSH(self->stack, obj, -1);
3317 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003318}
3319
3320
3321static int
Tim Peterscba30e22003-02-01 06:24:36 +00003322load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003323{
3324 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3325 int i, len;
3326 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003327
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003328 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003330 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3331 if (len < 2) return bad_readline();
3332 module_name = PyString_FromStringAndSize(s, len - 1);
3333 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003334
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003335 if ((len = (*self->readline_func)(self, &s)) >= 0) {
3336 if (len < 2) return bad_readline();
3337 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003338 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003339 self->find_class);
3340 Py_DECREF(class_name);
3341 }
3342 }
3343 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003344
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003345 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003347 if ((tup=Pdata_popTuple(self->stack, i))) {
3348 obj = Instance_New(class, tup);
3349 Py_DECREF(tup);
3350 }
3351 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003353 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003355 PDATA_PUSH(self->stack, obj, -1);
3356 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003357}
3358
3359
3360static int
Tim Peterscba30e22003-02-01 06:24:36 +00003361load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003362{
3363 PyObject *class = 0, *module_name = 0, *class_name = 0;
3364 int len;
3365 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003366
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003367 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3368 if (len < 2) return bad_readline();
3369 module_name = PyString_FromStringAndSize(s, len - 1);
3370 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003372 if ((len = (*self->readline_func)(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003373 if (len < 2) {
3374 Py_DECREF(module_name);
3375 return bad_readline();
3376 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003377 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003378 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003379 self->find_class);
3380 Py_DECREF(class_name);
3381 }
3382 }
3383 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003385 if (! class) return -1;
3386 PDATA_PUSH(self->stack, class, -1);
3387 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003388}
3389
3390
3391static int
Tim Peterscba30e22003-02-01 06:24:36 +00003392load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003393{
3394 PyObject *pid = 0;
3395 int len;
3396 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003398 if (self->pers_func) {
3399 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
3400 if (len < 2) return bad_readline();
3401
3402 pid = PyString_FromStringAndSize(s, len - 1);
3403 if (!pid) return -1;
3404
3405 if (PyList_Check(self->pers_func)) {
3406 if (PyList_Append(self->pers_func, pid) < 0) {
3407 Py_DECREF(pid);
3408 return -1;
3409 }
3410 }
3411 else {
3412 ARG_TUP(self, pid);
3413 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003414 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003415 NULL);
3416 FREE_ARG_TUP(self);
3417 }
3418 }
3419
3420 if (! pid) return -1;
3421
3422 PDATA_PUSH(self->stack, pid, -1);
3423 return 0;
3424 }
3425 else {
3426 PyErr_SetString(UnpicklingError,
3427 "A load persistent id instruction was encountered,\n"
3428 "but no persistent_load function was specified.");
3429 return -1;
3430 }
3431}
3432
3433static int
Tim Peterscba30e22003-02-01 06:24:36 +00003434load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003435{
3436 PyObject *pid = 0;
3437
3438 if (self->pers_func) {
3439 PDATA_POP(self->stack, pid);
3440 if (! pid) return -1;
3441
3442 if (PyList_Check(self->pers_func)) {
3443 if (PyList_Append(self->pers_func, pid) < 0) {
3444 Py_DECREF(pid);
3445 return -1;
3446 }
3447 }
3448 else {
3449 ARG_TUP(self, pid);
3450 if (self->arg) {
3451 pid = PyObject_Call(self->pers_func, self->arg,
3452 NULL);
3453 FREE_ARG_TUP(self);
3454 }
3455 if (! pid) return -1;
3456 }
3457
3458 PDATA_PUSH(self->stack, pid, -1);
3459 return 0;
3460 }
3461 else {
3462 PyErr_SetString(UnpicklingError,
3463 "A load persistent id instruction was encountered,\n"
3464 "but no persistent_load function was specified.");
3465 return -1;
3466 }
3467}
3468
3469
3470static int
Tim Peterscba30e22003-02-01 06:24:36 +00003471load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003472{
3473 int len;
3474
3475 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3476
3477 /* Note that we split the (pickle.py) stack into two stacks,
3478 an object stack and a mark stack. We have to be clever and
3479 pop the right one. We do this by looking at the top of the
3480 mark stack.
3481 */
3482
3483 if ((self->num_marks > 0) &&
3484 (self->marks[self->num_marks - 1] == len))
3485 self->num_marks--;
3486 else {
3487 len--;
3488 Py_DECREF(self->stack->data[len]);
3489 self->stack->length=len;
3490 }
3491
3492 return 0;
3493}
3494
3495
3496static int
Tim Peterscba30e22003-02-01 06:24:36 +00003497load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003498{
3499 int i;
3500
3501 if ((i = marker(self)) < 0)
3502 return -1;
3503
3504 Pdata_clear(self->stack, i);
3505
3506 return 0;
3507}
3508
3509
3510static int
Tim Peterscba30e22003-02-01 06:24:36 +00003511load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003512{
3513 PyObject *last;
3514 int len;
3515
3516 if ((len = self->stack->length) <= 0) return stackUnderflow();
3517 last=self->stack->data[len-1];
3518 Py_INCREF(last);
3519 PDATA_PUSH(self->stack, last, -1);
3520 return 0;
3521}
3522
3523
3524static int
Tim Peterscba30e22003-02-01 06:24:36 +00003525load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003526{
3527 PyObject *py_str = 0, *value = 0;
3528 int len;
3529 char *s;
3530 int rc;
3531
3532 if ((len = (*self->readline_func)(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003533 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003534
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003535 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003536
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003537 value = PyDict_GetItem(self->memo, py_str);
3538 if (! value) {
3539 PyErr_SetObject(BadPickleGet, py_str);
3540 rc = -1;
3541 } else {
3542 PDATA_APPEND(self->stack, value, -1);
3543 rc = 0;
3544 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003545
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003546 Py_DECREF(py_str);
3547 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003548}
3549
3550
3551static int
Tim Peterscba30e22003-02-01 06:24:36 +00003552load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003553{
3554 PyObject *py_key = 0, *value = 0;
3555 unsigned char key;
3556 char *s;
3557 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003558
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003559 if ((*self->read_func)(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003561 key = (unsigned char)s[0];
3562 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003564 value = PyDict_GetItem(self->memo, py_key);
3565 if (! value) {
3566 PyErr_SetObject(BadPickleGet, py_key);
3567 rc = -1;
3568 } else {
3569 PDATA_APPEND(self->stack, value, -1);
3570 rc = 0;
3571 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003572
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003573 Py_DECREF(py_key);
3574 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003575}
3576
3577
3578static int
Tim Peterscba30e22003-02-01 06:24:36 +00003579load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003580{
3581 PyObject *py_key = 0, *value = 0;
3582 unsigned char c;
3583 char *s;
3584 long key;
3585 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003586
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003587 if ((*self->read_func)(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003589 c = (unsigned char)s[0];
3590 key = (long)c;
3591 c = (unsigned char)s[1];
3592 key |= (long)c << 8;
3593 c = (unsigned char)s[2];
3594 key |= (long)c << 16;
3595 c = (unsigned char)s[3];
3596 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003598 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3599
3600 value = PyDict_GetItem(self->memo, py_key);
3601 if (! value) {
3602 PyErr_SetObject(BadPickleGet, py_key);
3603 rc = -1;
3604 } else {
3605 PDATA_APPEND(self->stack, value, -1);
3606 rc = 0;
3607 }
3608
3609 Py_DECREF(py_key);
3610 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003611}
3612
3613
3614static int
Tim Peterscba30e22003-02-01 06:24:36 +00003615load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003616{
3617 PyObject *py_str = 0, *value = 0;
3618 int len, l;
3619 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003621 if ((l = (*self->readline_func)(self, &s)) < 0) return -1;
3622 if (l < 2) return bad_readline();
3623 if (!( len=self->stack->length )) return stackUnderflow();
3624 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3625 value=self->stack->data[len-1];
3626 l=PyDict_SetItem(self->memo, py_str, value);
3627 Py_DECREF(py_str);
3628 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003629}
3630
3631
3632static int
Tim Peterscba30e22003-02-01 06:24:36 +00003633load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003634{
3635 PyObject *py_key = 0, *value = 0;
3636 unsigned char key;
3637 char *s;
3638 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003639
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003640 if ((*self->read_func)(self, &s, 1) < 0) return -1;
3641 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003642
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003643 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003644
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003645 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3646 value=self->stack->data[len-1];
3647 len=PyDict_SetItem(self->memo, py_key, value);
3648 Py_DECREF(py_key);
3649 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003650}
3651
3652
3653static int
Tim Peterscba30e22003-02-01 06:24:36 +00003654load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003655{
3656 PyObject *py_key = 0, *value = 0;
3657 long key;
3658 unsigned char c;
3659 char *s;
3660 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003662 if ((*self->read_func)(self, &s, 4) < 0) return -1;
3663 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003665 c = (unsigned char)s[0];
3666 key = (long)c;
3667 c = (unsigned char)s[1];
3668 key |= (long)c << 8;
3669 c = (unsigned char)s[2];
3670 key |= (long)c << 16;
3671 c = (unsigned char)s[3];
3672 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003673
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003674 if (!( py_key = PyInt_FromLong(key))) return -1;
3675 value=self->stack->data[len-1];
3676 len=PyDict_SetItem(self->memo, py_key, value);
3677 Py_DECREF(py_key);
3678 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003679}
3680
3681
3682static int
Tim Peterscba30e22003-02-01 06:24:36 +00003683do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003684{
3685 PyObject *value = 0, *list = 0, *append_method = 0;
3686 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003687
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003688 len=self->stack->length;
3689 if (!( len >= x && x > 0 )) return stackUnderflow();
3690 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003691 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003693 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003695 if (PyList_Check(list)) {
3696 PyObject *slice;
3697 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003698
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003699 slice=Pdata_popList(self->stack, x);
3700 list_len = PyList_GET_SIZE(list);
3701 i=PyList_SetSlice(list, list_len, list_len, slice);
3702 Py_DECREF(slice);
3703 return i;
3704 }
3705 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003706
Tim Peterscba30e22003-02-01 06:24:36 +00003707 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003708 return -1;
3709
3710 for (i = x; i < len; i++) {
3711 PyObject *junk;
3712
3713 value=self->stack->data[i];
3714 junk=0;
3715 ARG_TUP(self, value);
3716 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003717 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003718 NULL);
3719 FREE_ARG_TUP(self);
3720 }
3721 if (! junk) {
3722 Pdata_clear(self->stack, i+1);
3723 self->stack->length=x;
3724 Py_DECREF(append_method);
3725 return -1;
3726 }
3727 Py_DECREF(junk);
3728 }
3729 self->stack->length=x;
3730 Py_DECREF(append_method);
3731 }
3732
3733 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003734}
3735
3736
3737static int
Tim Peterscba30e22003-02-01 06:24:36 +00003738load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003739{
3740 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003741}
3742
3743
3744static int
Tim Peterscba30e22003-02-01 06:24:36 +00003745load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003746{
3747 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003748}
3749
3750
3751static int
Tim Peterscba30e22003-02-01 06:24:36 +00003752do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003753{
3754 PyObject *value = 0, *key = 0, *dict = 0;
3755 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003757 if (!( (len=self->stack->length) >= x
3758 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003760 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003762 for (i = x+1; i < len; i += 2) {
3763 key =self->stack->data[i-1];
3764 value=self->stack->data[i ];
3765 if (PyObject_SetItem(dict, key, value) < 0) {
3766 r=-1;
3767 break;
3768 }
3769 }
3770
3771 Pdata_clear(self->stack, x);
3772
3773 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003774}
3775
3776
Tim Peters84e87f32001-03-17 04:50:51 +00003777static int
Tim Peterscba30e22003-02-01 06:24:36 +00003778load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003779{
3780 return do_setitems(self, self->stack->length - 2);
3781}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003783static int
Tim Peterscba30e22003-02-01 06:24:36 +00003784load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003785{
3786 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00003787}
3788
Tim Peters84e87f32001-03-17 04:50:51 +00003789
Guido van Rossum60456fd1997-04-09 17:36:32 +00003790static int
Tim Peterscba30e22003-02-01 06:24:36 +00003791load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003792{
3793 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
3794 *junk = 0, *__setstate__ = 0;
3795 int i, r = 0;
3796
3797 if (self->stack->length < 2) return stackUnderflow();
3798 PDATA_POP(self->stack, value);
3799 if (! value) return -1;
3800 inst=self->stack->data[self->stack->length-1];
3801
3802 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
3803 ARG_TUP(self, value);
3804 if (self->arg) {
3805 junk = PyObject_Call(__setstate__, self->arg, NULL);
3806 FREE_ARG_TUP(self);
3807 }
3808 Py_DECREF(__setstate__);
3809 if (! junk) return -1;
3810 Py_DECREF(junk);
3811 return 0;
3812 }
3813
3814 PyErr_Clear();
3815 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
3816 i = 0;
3817 while (PyDict_Next(value, &i, &d_key, &d_value)) {
3818 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
3819 r=-1;
3820 break;
3821 }
3822 }
3823 Py_DECREF(instdict);
3824 }
3825 else r=-1;
3826
3827 Py_XDECREF(value);
3828
3829 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003830}
3831
3832
3833static int
Tim Peterscba30e22003-02-01 06:24:36 +00003834load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003835{
3836 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003837
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003838 /* Note that we split the (pickle.py) stack into two stacks, an
3839 object stack and a mark stack. Here we push a mark onto the
3840 mark stack.
3841 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003843 if ((self->num_marks + 1) >= self->marks_size) {
3844 s=self->marks_size+20;
3845 if (s <= self->num_marks) s=self->num_marks + 1;
3846 if (self->marks == NULL)
3847 self->marks=(int *)malloc(s * sizeof(int));
3848 else
Tim Peterscba30e22003-02-01 06:24:36 +00003849 self->marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003850 s * sizeof(int));
3851 if (! self->marks) {
3852 PyErr_NoMemory();
3853 return -1;
3854 }
3855 self->marks_size = s;
3856 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003858 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003860 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003861}
3862
Guido van Rossum60456fd1997-04-09 17:36:32 +00003863static int
Tim Peterscba30e22003-02-01 06:24:36 +00003864load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003865{
3866 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003868 PDATA_POP(self->stack, arg_tup);
3869 if (! arg_tup) return -1;
3870 PDATA_POP(self->stack, callable);
3871 if (callable) {
3872 ob = Instance_New(callable, arg_tup);
3873 Py_DECREF(callable);
3874 }
3875 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003877 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003879 PDATA_PUSH(self->stack, ob, -1);
3880 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003881}
Tim Peters84e87f32001-03-17 04:50:51 +00003882
Tim Peters4190fb82003-02-02 16:09:05 +00003883/* Just raises an error if we don't know the protocol specified. PROTO
3884 * is the first opcode for protocols >= 2.
3885 */
3886static int
3887load_proto(Unpicklerobject *self)
3888{
3889 int i;
3890 char *protobyte;
3891
3892 i = self->read_func(self, &protobyte, 1);
3893 if (i < 0)
3894 return -1;
3895
3896 i = calc_binint(protobyte, 1);
3897 /* No point checking for < 0, since calc_binint returns an unsigned
3898 * int when chewing on 1 byte.
3899 */
3900 assert(i >= 0);
3901 if (i <= CURRENT_PROTOCOL_NUMBER)
3902 return 0;
3903
3904 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
3905 return -1;
3906}
3907
Guido van Rossum60456fd1997-04-09 17:36:32 +00003908static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003909load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003910{
3911 PyObject *err = 0, *val = 0;
3912 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003914 self->num_marks = 0;
3915 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003916
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003917 while (1) {
3918 if ((*self->read_func)(self, &s, 1) < 0)
3919 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003921 switch (s[0]) {
3922 case NONE:
3923 if (load_none(self) < 0)
3924 break;
3925 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003926
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003927 case BININT:
3928 if (load_binint(self) < 0)
3929 break;
3930 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003931
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003932 case BININT1:
3933 if (load_binint1(self) < 0)
3934 break;
3935 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003936
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003937 case BININT2:
3938 if (load_binint2(self) < 0)
3939 break;
3940 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003942 case INT:
3943 if (load_int(self) < 0)
3944 break;
3945 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003947 case LONG:
3948 if (load_long(self) < 0)
3949 break;
3950 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003951
Tim Petersee1a53c2003-02-02 02:57:53 +00003952 case LONG1:
3953 if (load_counted_long(self, 1) < 0)
3954 break;
3955 continue;
3956
3957 case LONG4:
3958 if (load_counted_long(self, 4) < 0)
3959 break;
3960 continue;
3961
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003962 case FLOAT:
3963 if (load_float(self) < 0)
3964 break;
3965 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003967 case BINFLOAT:
3968 if (load_binfloat(self) < 0)
3969 break;
3970 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003971
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003972 case BINSTRING:
3973 if (load_binstring(self) < 0)
3974 break;
3975 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003976
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003977 case SHORT_BINSTRING:
3978 if (load_short_binstring(self) < 0)
3979 break;
3980 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003981
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003982 case STRING:
3983 if (load_string(self) < 0)
3984 break;
3985 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003986
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003987#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003988 case UNICODE:
3989 if (load_unicode(self) < 0)
3990 break;
3991 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003992
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003993 case BINUNICODE:
3994 if (load_binunicode(self) < 0)
3995 break;
3996 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003997#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003998
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003999 case EMPTY_TUPLE:
4000 if (load_empty_tuple(self) < 0)
4001 break;
4002 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004004 case TUPLE:
4005 if (load_tuple(self) < 0)
4006 break;
4007 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004008
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004009 case EMPTY_LIST:
4010 if (load_empty_list(self) < 0)
4011 break;
4012 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004014 case LIST:
4015 if (load_list(self) < 0)
4016 break;
4017 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004018
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004019 case EMPTY_DICT:
4020 if (load_empty_dict(self) < 0)
4021 break;
4022 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004024 case DICT:
4025 if (load_dict(self) < 0)
4026 break;
4027 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004028
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004029 case OBJ:
4030 if (load_obj(self) < 0)
4031 break;
4032 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004034 case INST:
4035 if (load_inst(self) < 0)
4036 break;
4037 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004039 case GLOBAL:
4040 if (load_global(self) < 0)
4041 break;
4042 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004043
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004044 case APPEND:
4045 if (load_append(self) < 0)
4046 break;
4047 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004048
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004049 case APPENDS:
4050 if (load_appends(self) < 0)
4051 break;
4052 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004053
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004054 case BUILD:
4055 if (load_build(self) < 0)
4056 break;
4057 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004059 case DUP:
4060 if (load_dup(self) < 0)
4061 break;
4062 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004063
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004064 case BINGET:
4065 if (load_binget(self) < 0)
4066 break;
4067 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004069 case LONG_BINGET:
4070 if (load_long_binget(self) < 0)
4071 break;
4072 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004073
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004074 case GET:
4075 if (load_get(self) < 0)
4076 break;
4077 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004078
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004079 case MARK:
4080 if (load_mark(self) < 0)
4081 break;
4082 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004084 case BINPUT:
4085 if (load_binput(self) < 0)
4086 break;
4087 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004089 case LONG_BINPUT:
4090 if (load_long_binput(self) < 0)
4091 break;
4092 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004093
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004094 case PUT:
4095 if (load_put(self) < 0)
4096 break;
4097 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004099 case POP:
4100 if (load_pop(self) < 0)
4101 break;
4102 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004103
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004104 case POP_MARK:
4105 if (load_pop_mark(self) < 0)
4106 break;
4107 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004109 case SETITEM:
4110 if (load_setitem(self) < 0)
4111 break;
4112 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004114 case SETITEMS:
4115 if (load_setitems(self) < 0)
4116 break;
4117 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004119 case STOP:
4120 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004122 case PERSID:
4123 if (load_persid(self) < 0)
4124 break;
4125 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004126
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004127 case BINPERSID:
4128 if (load_binpersid(self) < 0)
4129 break;
4130 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004132 case REDUCE:
4133 if (load_reduce(self) < 0)
4134 break;
4135 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004136
Tim Peters4190fb82003-02-02 16:09:05 +00004137 case PROTO:
4138 if (load_proto(self) < 0)
4139 break;
4140 continue;
4141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004142 case '\0':
4143 /* end of file */
4144 PyErr_SetNone(PyExc_EOFError);
4145 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004147 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004148 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004149 "invalid load key, '%s'.",
4150 "c", s[0]);
4151 return NULL;
4152 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004153
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004154 break;
4155 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004157 if ((err = PyErr_Occurred())) {
4158 if (err == PyExc_EOFError) {
4159 PyErr_SetNone(PyExc_EOFError);
4160 }
4161 return NULL;
4162 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004164 PDATA_POP(self->stack, val);
4165 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004166}
Tim Peters84e87f32001-03-17 04:50:51 +00004167
Guido van Rossum60456fd1997-04-09 17:36:32 +00004168
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004169/* No-load functions to support noload, which is used to
4170 find persistent references. */
4171
4172static int
Tim Peterscba30e22003-02-01 06:24:36 +00004173noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004174{
4175 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004177 if ((i = marker(self)) < 0) return -1;
4178 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004179}
4180
4181
4182static int
Tim Peterscba30e22003-02-01 06:24:36 +00004183noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004184{
4185 int i;
4186 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004188 if ((i = marker(self)) < 0) return -1;
4189 Pdata_clear(self->stack, i);
4190 if ((*self->readline_func)(self, &s) < 0) return -1;
4191 if ((*self->readline_func)(self, &s) < 0) return -1;
4192 PDATA_APPEND(self->stack, Py_None,-1);
4193 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004194}
4195
4196static int
Tim Peterscba30e22003-02-01 06:24:36 +00004197noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004198{
4199 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004200
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004201 if ((*self->readline_func)(self, &s) < 0) return -1;
4202 if ((*self->readline_func)(self, &s) < 0) return -1;
4203 PDATA_APPEND(self->stack, Py_None,-1);
4204 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004205}
4206
4207static int
Tim Peterscba30e22003-02-01 06:24:36 +00004208noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004209{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004211 if (self->stack->length < 2) return stackUnderflow();
4212 Pdata_clear(self->stack, self->stack->length-2);
4213 PDATA_APPEND(self->stack, Py_None,-1);
4214 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004215}
4216
4217static int
4218noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004219
Guido van Rossum053b8df1998-11-25 16:18:00 +00004220 if (self->stack->length < 1) return stackUnderflow();
4221 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004222 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004223}
4224
4225
4226static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004227noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004228{
4229 PyObject *err = 0, *val = 0;
4230 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004232 self->num_marks = 0;
4233 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004235 while (1) {
4236 if ((*self->read_func)(self, &s, 1) < 0)
4237 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004239 switch (s[0]) {
4240 case NONE:
4241 if (load_none(self) < 0)
4242 break;
4243 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004245 case BININT:
4246 if (load_binint(self) < 0)
4247 break;
4248 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004249
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004250 case BININT1:
4251 if (load_binint1(self) < 0)
4252 break;
4253 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004254
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004255 case BININT2:
4256 if (load_binint2(self) < 0)
4257 break;
4258 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004259
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004260 case INT:
4261 if (load_int(self) < 0)
4262 break;
4263 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004265 case LONG:
4266 if (load_long(self) < 0)
4267 break;
4268 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004269
Tim Peters4190fb82003-02-02 16:09:05 +00004270 case LONG1:
4271 if (load_counted_long(self, 1) < 0)
4272 break;
4273 continue;
4274
4275 case LONG4:
4276 if (load_counted_long(self, 4) < 0)
4277 break;
4278 continue;
4279
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004280 case FLOAT:
4281 if (load_float(self) < 0)
4282 break;
4283 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004284
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004285 case BINFLOAT:
4286 if (load_binfloat(self) < 0)
4287 break;
4288 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004289
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004290 case BINSTRING:
4291 if (load_binstring(self) < 0)
4292 break;
4293 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004294
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004295 case SHORT_BINSTRING:
4296 if (load_short_binstring(self) < 0)
4297 break;
4298 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004300 case STRING:
4301 if (load_string(self) < 0)
4302 break;
4303 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004304
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004305#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004306 case UNICODE:
4307 if (load_unicode(self) < 0)
4308 break;
4309 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004311 case BINUNICODE:
4312 if (load_binunicode(self) < 0)
4313 break;
4314 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004315#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004316
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004317 case EMPTY_TUPLE:
4318 if (load_empty_tuple(self) < 0)
4319 break;
4320 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004322 case TUPLE:
4323 if (load_tuple(self) < 0)
4324 break;
4325 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004326
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004327 case EMPTY_LIST:
4328 if (load_empty_list(self) < 0)
4329 break;
4330 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004331
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004332 case LIST:
4333 if (load_list(self) < 0)
4334 break;
4335 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004336
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004337 case EMPTY_DICT:
4338 if (load_empty_dict(self) < 0)
4339 break;
4340 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004342 case DICT:
4343 if (load_dict(self) < 0)
4344 break;
4345 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004347 case OBJ:
4348 if (noload_obj(self) < 0)
4349 break;
4350 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004351
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004352 case INST:
4353 if (noload_inst(self) < 0)
4354 break;
4355 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004356
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004357 case GLOBAL:
4358 if (noload_global(self) < 0)
4359 break;
4360 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004362 case APPEND:
4363 if (load_append(self) < 0)
4364 break;
4365 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004366
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004367 case APPENDS:
4368 if (load_appends(self) < 0)
4369 break;
4370 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004372 case BUILD:
4373 if (noload_build(self) < 0)
4374 break;
4375 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004377 case DUP:
4378 if (load_dup(self) < 0)
4379 break;
4380 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004382 case BINGET:
4383 if (load_binget(self) < 0)
4384 break;
4385 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004387 case LONG_BINGET:
4388 if (load_long_binget(self) < 0)
4389 break;
4390 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004391
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004392 case GET:
4393 if (load_get(self) < 0)
4394 break;
4395 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004397 case MARK:
4398 if (load_mark(self) < 0)
4399 break;
4400 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004402 case BINPUT:
4403 if (load_binput(self) < 0)
4404 break;
4405 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004407 case LONG_BINPUT:
4408 if (load_long_binput(self) < 0)
4409 break;
4410 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004411
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004412 case PUT:
4413 if (load_put(self) < 0)
4414 break;
4415 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004417 case POP:
4418 if (load_pop(self) < 0)
4419 break;
4420 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004421
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004422 case POP_MARK:
4423 if (load_pop_mark(self) < 0)
4424 break;
4425 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004427 case SETITEM:
4428 if (load_setitem(self) < 0)
4429 break;
4430 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004431
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004432 case SETITEMS:
4433 if (load_setitems(self) < 0)
4434 break;
4435 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004437 case STOP:
4438 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004440 case PERSID:
4441 if (load_persid(self) < 0)
4442 break;
4443 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004445 case BINPERSID:
4446 if (load_binpersid(self) < 0)
4447 break;
4448 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004450 case REDUCE:
4451 if (noload_reduce(self) < 0)
4452 break;
4453 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004454
Tim Peters4190fb82003-02-02 16:09:05 +00004455 case PROTO:
4456 if (load_proto(self) < 0)
4457 break;
4458 continue;
4459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004460 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004461 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004462 "invalid load key, '%s'.",
4463 "c", s[0]);
4464 return NULL;
4465 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004466
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004467 break;
4468 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004469
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004470 if ((err = PyErr_Occurred())) {
4471 if (err == PyExc_EOFError) {
4472 PyErr_SetNone(PyExc_EOFError);
4473 }
4474 return NULL;
4475 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004476
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004477 PDATA_POP(self->stack, val);
4478 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004479}
Tim Peters84e87f32001-03-17 04:50:51 +00004480
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004481
Guido van Rossum60456fd1997-04-09 17:36:32 +00004482static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004483Unpickler_load(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004484{
Tim Peterscba30e22003-02-01 06:24:36 +00004485 if (!( PyArg_ParseTuple(args, ":load")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004486 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004487
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004488 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004489}
4490
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004491static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004492Unpickler_noload(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004493{
Tim Peterscba30e22003-02-01 06:24:36 +00004494 if (!( PyArg_ParseTuple(args, ":noload")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004495 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004496
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004497 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004498}
4499
Guido van Rossum60456fd1997-04-09 17:36:32 +00004500
4501static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004502 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004503 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004504 },
Neal Norwitzb0493252002-03-31 14:44:22 +00004505 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004506 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004507 "noload() -- not load a pickle, but go through most of the motions\n"
4508 "\n"
4509 "This function can be used to read past a pickle without instantiating\n"
4510 "any objects or importing any modules. It can also be used to find all\n"
4511 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004512 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004513 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004514 {NULL, NULL} /* sentinel */
4515};
4516
4517
4518static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004519newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004520{
4521 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004522
Tim Peterscba30e22003-02-01 06:24:36 +00004523 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004524 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004525
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004526 self->file = NULL;
4527 self->arg = NULL;
4528 self->stack = (Pdata*)Pdata_New();
4529 self->pers_func = NULL;
4530 self->last_string = NULL;
4531 self->marks = NULL;
4532 self->num_marks = 0;
4533 self->marks_size = 0;
4534 self->buf_size = 0;
4535 self->read = NULL;
4536 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004537 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004538
Tim Peterscba30e22003-02-01 06:24:36 +00004539 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004540 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004542 Py_INCREF(f);
4543 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004545 /* Set read, readline based on type of f */
4546 if (PyFile_Check(f)) {
4547 self->fp = PyFile_AsFile(f);
4548 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00004549 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004550 "I/O operation on closed file");
4551 goto err;
4552 }
4553 self->read_func = read_file;
4554 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00004555 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004556 else if (PycStringIO_InputCheck(f)) {
4557 self->fp = NULL;
4558 self->read_func = read_cStringIO;
4559 self->readline_func = readline_cStringIO;
4560 }
4561 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004562
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004563 self->fp = NULL;
4564 self->read_func = read_other;
4565 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004567 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
4568 (self->read = PyObject_GetAttr(f, read_str)))) {
4569 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00004570 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004571 "argument must have 'read' and "
4572 "'readline' attributes" );
4573 goto err;
4574 }
4575 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004577 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004579 err:
4580 Py_DECREF((PyObject *)self);
4581 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004582}
4583
4584
4585static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004586get_Unpickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004587{
4588 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00004589
Tim Peterscba30e22003-02-01 06:24:36 +00004590 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004591 return NULL;
4592 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004593}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004594
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004595
Guido van Rossum60456fd1997-04-09 17:36:32 +00004596static void
Tim Peterscba30e22003-02-01 06:24:36 +00004597Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004598{
4599 Py_XDECREF(self->readline);
4600 Py_XDECREF(self->read);
4601 Py_XDECREF(self->file);
4602 Py_XDECREF(self->memo);
4603 Py_XDECREF(self->stack);
4604 Py_XDECREF(self->pers_func);
4605 Py_XDECREF(self->arg);
4606 Py_XDECREF(self->last_string);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004608 if (self->marks) {
4609 free(self->marks);
4610 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004612 if (self->buf_size) {
4613 free(self->buf);
4614 }
Tim Peters84e87f32001-03-17 04:50:51 +00004615
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004616 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004617}
4618
4619
4620static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004621Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004622{
4623 if (!strcmp(name, "persistent_load")) {
4624 if (!self->pers_func) {
4625 PyErr_SetString(PyExc_AttributeError, name);
4626 return NULL;
4627 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004628
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004629 Py_INCREF(self->pers_func);
4630 return self->pers_func;
4631 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004632
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004633 if (!strcmp(name, "find_global")) {
4634 if (!self->find_class) {
4635 PyErr_SetString(PyExc_AttributeError, name);
4636 return NULL;
4637 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004638
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004639 Py_INCREF(self->find_class);
4640 return self->find_class;
4641 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004642
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004643 if (!strcmp(name, "memo")) {
4644 if (!self->memo) {
4645 PyErr_SetString(PyExc_AttributeError, name);
4646 return NULL;
4647 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004648
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004649 Py_INCREF(self->memo);
4650 return self->memo;
4651 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004653 if (!strcmp(name, "UnpicklingError")) {
4654 Py_INCREF(UnpicklingError);
4655 return UnpicklingError;
4656 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004657
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004658 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004659}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004660
Guido van Rossum60456fd1997-04-09 17:36:32 +00004661
4662static int
Tim Peterscba30e22003-02-01 06:24:36 +00004663Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004664{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004665
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004666 if (!strcmp(name, "persistent_load")) {
4667 Py_XDECREF(self->pers_func);
4668 self->pers_func = value;
4669 Py_XINCREF(value);
4670 return 0;
4671 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004672
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004673 if (!strcmp(name, "find_global")) {
4674 Py_XDECREF(self->find_class);
4675 self->find_class = value;
4676 Py_XINCREF(value);
4677 return 0;
4678 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00004679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004680 if (! value) {
4681 PyErr_SetString(PyExc_TypeError,
4682 "attribute deletion is not supported");
4683 return -1;
4684 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004685
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004686 if (strcmp(name, "memo") == 0) {
4687 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00004688 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004689 "memo must be a dictionary");
4690 return -1;
4691 }
4692 Py_XDECREF(self->memo);
4693 self->memo = value;
4694 Py_INCREF(value);
4695 return 0;
4696 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00004697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004698 PyErr_SetString(PyExc_AttributeError, name);
4699 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004700}
4701
Tim Peters5bd2a792003-02-01 16:45:06 +00004702/* ---------------------------------------------------------------------------
4703 * Module-level functions.
4704 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004705
Tim Peters5bd2a792003-02-01 16:45:06 +00004706/* dump(obj, file, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004707static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004708cpm_dump(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004709{
4710 PyObject *ob, *file, *res = NULL;
4711 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00004712 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004713
Tim Peters5bd2a792003-02-01 16:45:06 +00004714 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004715 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004716
Tim Peters5bd2a792003-02-01 16:45:06 +00004717 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004718 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004720 if (dump(pickler, ob) < 0)
4721 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004722
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004723 Py_INCREF(Py_None);
4724 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004725
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004726 finally:
4727 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004728
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004729 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004730}
4731
4732
Tim Peters5bd2a792003-02-01 16:45:06 +00004733/* dumps(obj, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004734static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004735cpm_dumps(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004736{
4737 PyObject *ob, *file = 0, *res = NULL;
4738 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00004739 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004740
Tim Peters5bd2a792003-02-01 16:45:06 +00004741 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004742 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004743
Tim Peterscba30e22003-02-01 06:24:36 +00004744 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004745 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004746
Tim Peters5bd2a792003-02-01 16:45:06 +00004747 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004748 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004750 if (dump(pickler, ob) < 0)
4751 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004753 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004754
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004755 finally:
4756 Py_XDECREF(pickler);
4757 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004759 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00004760}
4761
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004762
Tim Peters5bd2a792003-02-01 16:45:06 +00004763/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004764static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004765cpm_load(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004766{
4767 Unpicklerobject *unpickler = 0;
4768 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004769
Tim Peterscba30e22003-02-01 06:24:36 +00004770 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004771 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004772
Tim Peterscba30e22003-02-01 06:24:36 +00004773 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004774 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004776 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004778 finally:
4779 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004781 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004782}
4783
4784
Tim Peters5bd2a792003-02-01 16:45:06 +00004785/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004786static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004787cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004788{
4789 PyObject *ob, *file = 0, *res = NULL;
4790 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004791
Tim Peterscba30e22003-02-01 06:24:36 +00004792 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004793 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004794
Tim Peterscba30e22003-02-01 06:24:36 +00004795 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004796 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00004797
Tim Peterscba30e22003-02-01 06:24:36 +00004798 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004799 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004800
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004801 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004803 finally:
4804 Py_XDECREF(file);
4805 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004806
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004807 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004808}
4809
4810
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004811PyDoc_STRVAR(Unpicklertype__doc__,
4812"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004813
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004814static PyTypeObject Unpicklertype = {
4815 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00004816 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00004817 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00004818 sizeof(Unpicklerobject), /*tp_basicsize*/
4819 0, /*tp_itemsize*/
4820 /* methods */
4821 (destructor)Unpickler_dealloc, /*tp_dealloc*/
4822 (printfunc)0, /*tp_print*/
4823 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
4824 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
4825 (cmpfunc)0, /*tp_compare*/
4826 (reprfunc)0, /*tp_repr*/
4827 0, /*tp_as_number*/
4828 0, /*tp_as_sequence*/
4829 0, /*tp_as_mapping*/
4830 (hashfunc)0, /*tp_hash*/
4831 (ternaryfunc)0, /*tp_call*/
4832 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004833
Guido van Rossum60456fd1997-04-09 17:36:32 +00004834 /* Space for future expansion */
4835 0L,0L,0L,0L,
4836 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00004837};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004838
Guido van Rossum60456fd1997-04-09 17:36:32 +00004839static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00004840 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004841 PyDoc_STR("dump(object, file, proto=0) -- "
4842 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004843 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00004844 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004845 },
Tim Peters5bd2a792003-02-01 16:45:06 +00004846
Neal Norwitzb0493252002-03-31 14:44:22 +00004847 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004848 PyDoc_STR("dumps(object, proto=0) -- "
4849 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004850 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00004851 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004852 },
Tim Peters5bd2a792003-02-01 16:45:06 +00004853
Neal Norwitzb0493252002-03-31 14:44:22 +00004854 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004855 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00004856
Neal Norwitzb0493252002-03-31 14:44:22 +00004857 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004858 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00004859
Neal Norwitzb0493252002-03-31 14:44:22 +00004860 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004861 PyDoc_STR("Pickler(file, proto=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004862 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00004863 "This takes a file-like object for writing a pickle data stream.\n"
4864 "The optional proto argument tells the pickler to use the given\n"
4865 "protocol; supported protocols are 0, 1, 2. The default\n"
4866 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
4867 "only protocol that can be written to a file opened in text\n"
4868 "mode and read back successfully. When using a protocol higher\n"
4869 "than 0, make sure the file is opened in binary mode, both when\n"
4870 "pickling and unpickling.)\n"
4871 "\n"
4872 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
4873 "more efficient than protocol 1.\n"
4874 "\n"
4875 "Specifying a negative protocol version selects the highest\n"
4876 "protocol version supported. The higher the protocol used, the\n"
4877 "more recent the version of Python needed to read the pickle\n"
4878 "produced.\n"
4879 "\n"
4880 "The file parameter must have a write() method that accepts a single\n"
4881 "string argument. It can thus be an open file object, a StringIO\n"
4882 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004883 },
Tim Peters5bd2a792003-02-01 16:45:06 +00004884
Neal Norwitzb0493252002-03-31 14:44:22 +00004885 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00004886 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
4887
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004888 { NULL, NULL }
4889};
4890
Guido van Rossum60456fd1997-04-09 17:36:32 +00004891static int
Tim Peterscba30e22003-02-01 06:24:36 +00004892init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004893{
4894 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004895
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00004896#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004898 INIT_STR(__class__);
4899 INIT_STR(__getinitargs__);
4900 INIT_STR(__dict__);
4901 INIT_STR(__getstate__);
4902 INIT_STR(__setstate__);
4903 INIT_STR(__name__);
4904 INIT_STR(__main__);
4905 INIT_STR(__reduce__);
4906 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004907 INIT_STR(append);
4908 INIT_STR(read);
4909 INIT_STR(readline);
4910 INIT_STR(copy_reg);
4911 INIT_STR(dispatch_table);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004912 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004913
Tim Peterscba30e22003-02-01 06:24:36 +00004914 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004915 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004916
Tim Peters1f1b2d22003-02-01 02:16:37 +00004917 /* This is special because we want to use a different
4918 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004919 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peterscba30e22003-02-01 06:24:36 +00004920 if (!dispatch_table)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004921 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004922
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004923 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004924
Tim Peterscba30e22003-02-01 06:24:36 +00004925 if (!( empty_tuple = PyTuple_New(0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004926 return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004927
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004928 /* Ugh */
4929 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
4930 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
4931 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004932
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004933 if (!( t=PyDict_New())) return -1;
4934 if (!( r=PyRun_String(
4935 "def __init__(self, *args): self.args=args\n\n"
4936 "def __str__(self):\n"
4937 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
4938 Py_file_input,
4939 module_dict, t) )) return -1;
4940 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004942 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00004943 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004944 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004946 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004947
Tim Peterscba30e22003-02-01 06:24:36 +00004948 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004949 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00004950 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004951 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004953 if (!( t=PyDict_New())) return -1;
4954 if (!( r=PyRun_String(
4955 "def __init__(self, *args): self.args=args\n\n"
4956 "def __str__(self):\n"
4957 " a=self.args\n"
4958 " a=a and type(a[0]) or '(what)'\n"
4959 " return 'Cannot pickle %s objects' % a\n"
4960 , Py_file_input,
4961 module_dict, t) )) return -1;
4962 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00004963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004964 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00004965 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004966 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004967
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004968 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00004969
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004970 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00004971 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004972 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004973
Martin v. Löwis658009a2002-09-16 17:26:24 +00004974 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
4975 UnpicklingError, NULL)))
4976 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00004977
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004978 if (PyDict_SetItemString(module_dict, "PickleError",
4979 PickleError) < 0)
4980 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004981
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004982 if (PyDict_SetItemString(module_dict, "PicklingError",
4983 PicklingError) < 0)
4984 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004985
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004986 if (PyDict_SetItemString(module_dict, "UnpicklingError",
4987 UnpicklingError) < 0)
4988 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004989
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004990 if (PyDict_SetItemString(module_dict, "UnpickleableError",
4991 UnpickleableError) < 0)
4992 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004993
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004994 if (PyDict_SetItemString(module_dict, "BadPickleGet",
4995 BadPickleGet) < 0)
4996 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00004997
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004998 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00004999
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005000 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005001}
5002
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005003#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5004#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005005#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005006PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005007initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005008{
5009 PyObject *m, *d, *di, *v, *k;
5010 int i;
5011 char *rev="1.71";
5012 PyObject *format_version;
5013 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005014
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005015 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005016 Unpicklertype.ob_type = &PyType_Type;
5017 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005018
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005019 /* Initialize some pieces. We need to do this before module creation,
5020 so we're forced to use a temporary dictionary. :(
5021 */
5022 di=PyDict_New();
5023 if (!di) return;
5024 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005026 /* Create the module and add the functions */
5027 m = Py_InitModule4("cPickle", cPickle_methods,
5028 cPickle_module_documentation,
5029 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005031 /* Add some symbolic constants to the module */
5032 d = PyModule_GetDict(m);
5033 PyDict_SetItemString(d,"__version__", v = PyString_FromString(rev));
5034 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005035
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005036 /* Copy data from di. Waaa. */
5037 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5038 if (PyObject_SetItem(d, k, v) < 0) {
5039 Py_DECREF(di);
5040 return;
5041 }
5042 }
5043 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005045 format_version = PyString_FromString("1.3");
5046 compatible_formats = Py_BuildValue("[sss]", "1.0", "1.1", "1.2");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005047
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005048 PyDict_SetItemString(d, "format_version", format_version);
5049 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5050 Py_XDECREF(format_version);
5051 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005052}