blob: 09485b9ba54feeaaba73434a86961f7eefdd091a [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. */
Tim Peters8587b3c2003-02-13 15:44:41 +000018#define HIGHEST_PROTOCOL 2
Tim Peters5bd2a792003-02-01 16:45:06 +000019
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
Tim Peters1092d642003-02-11 21:06:20 +000090/* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements
Tim Peters42f08ac2003-02-11 22:43:24 +000091 * batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will
92 * break if this gets out of synch with pickle.py, but it's unclear that
93 * would help anything either.
Tim Peters1092d642003-02-11 21:06:20 +000094 */
95#define BATCHSIZE 1000
96
Guido van Rossum60456fd1997-04-09 17:36:32 +000097static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000098
Guido van Rossumc03158b1999-06-09 15:23:31 +000099static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000100static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +0000101static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000102static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000103static PyObject *BadPickleGet;
104
Tim Peters5b7da392003-02-04 00:21:07 +0000105/* As the name says, an empty tuple. */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000106static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000107
Tim Peters5b7da392003-02-04 00:21:07 +0000108/* copy_reg.dispatch_table, {type_object: pickling_function} */
109static PyObject *dispatch_table;
110
111/* For EXT[124] opcodes. */
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000112/* copy_reg._extension_registry, {(module_name, function_name): code} */
Tim Peters5b7da392003-02-04 00:21:07 +0000113static PyObject *extension_registry;
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000114/* copy_reg._inverted_registry, {code: (module_name, function_name)} */
Tim Peters5b7da392003-02-04 00:21:07 +0000115static PyObject *inverted_registry;
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000116/* copy_reg._extension_cache, {code: object} */
Tim Peters5b7da392003-02-04 00:21:07 +0000117static PyObject *extension_cache;
118
Tim Peters731098b2003-02-04 20:56:09 +0000119/* For looking up name pairs in copy_reg._extension_registry. */
120static PyObject *two_tuple;
121
Guido van Rossum60456fd1997-04-09 17:36:32 +0000122static PyObject *__class___str, *__getinitargs___str, *__dict___str,
123 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000124 *write_str, *append_str,
Guido van Rossum9716aaa1997-12-08 15:15:16 +0000125 *read_str, *readline_str, *__main___str, *__basicnew___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000126 *copy_reg_str, *dispatch_table_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000127
Guido van Rossum053b8df1998-11-25 16:18:00 +0000128/*************************************************************************
129 Internal Data type for pickle data. */
130
131typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000132 PyObject_HEAD
Tim Peters1d63c9f2003-02-02 20:29:39 +0000133 int length; /* number of initial slots in data currently used */
134 int size; /* number of slots in data allocated */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000135 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000136} Pdata;
137
Tim Peters84e87f32001-03-17 04:50:51 +0000138static void
Tim Peterscba30e22003-02-01 06:24:36 +0000139Pdata_dealloc(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000140{
141 int i;
142 PyObject **p;
Tim Peterscba30e22003-02-01 06:24:36 +0000143
Tim Peters1d63c9f2003-02-02 20:29:39 +0000144 for (i = self->length, p = self->data; --i >= 0; p++) {
145 Py_DECREF(*p);
146 }
147 if (self->data)
148 free(self->data);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000149 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000150}
151
152static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000153 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
154 (destructor)Pdata_dealloc,
155 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000156};
157
158#define Pdata_Check(O) ((O)->ob_type == &PdataType)
159
160static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000161Pdata_New(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000162{
163 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000164
Tim Peters1d63c9f2003-02-02 20:29:39 +0000165 if (!(self = PyObject_New(Pdata, &PdataType)))
166 return NULL;
167 self->size = 8;
168 self->length = 0;
169 self->data = malloc(self->size * sizeof(PyObject*));
170 if (self->data)
171 return (PyObject*)self;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000172 Py_DECREF(self);
173 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000174}
175
Tim Peters84e87f32001-03-17 04:50:51 +0000176static int
Tim Peterscba30e22003-02-01 06:24:36 +0000177stackUnderflow(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000178{
179 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
180 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000181}
182
Tim Peters1d63c9f2003-02-02 20:29:39 +0000183/* Retain only the initial clearto items. If clearto >= the current
184 * number of items, this is a (non-erroneous) NOP.
185 */
Guido van Rossum053b8df1998-11-25 16:18:00 +0000186static int
Tim Peterscba30e22003-02-01 06:24:36 +0000187Pdata_clear(Pdata *self, int clearto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000188{
189 int i;
190 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000192 if (clearto < 0) return stackUnderflow();
193 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000194
Tim Peters1d63c9f2003-02-02 20:29:39 +0000195 for (i = self->length, p = self->data + clearto;
196 --i >= clearto;
197 p++) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000198 Py_DECREF(*p);
Tim Peters1d63c9f2003-02-02 20:29:39 +0000199 }
200 self->length = clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000202 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000203}
204
Tim Peters84e87f32001-03-17 04:50:51 +0000205static int
Tim Peterscba30e22003-02-01 06:24:36 +0000206Pdata_grow(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000207{
Tim Peters1d63c9f2003-02-02 20:29:39 +0000208 int bigger;
209 size_t nbytes;
210
Tim Peters1d63c9f2003-02-02 20:29:39 +0000211 bigger = self->size << 1;
Tim Peterse0a39072003-02-03 15:45:56 +0000212 if (bigger <= 0) /* was 0, or new value overflows */
Tim Peters1d63c9f2003-02-02 20:29:39 +0000213 goto nomemory;
214 if ((int)(size_t)bigger != bigger)
215 goto nomemory;
216 nbytes = (size_t)bigger * sizeof(PyObject *);
217 if (nbytes / sizeof(PyObject *) != (size_t)bigger)
218 goto nomemory;
219 self->data = realloc(self->data, nbytes);
220 if (self->data == NULL)
221 goto nomemory;
222 self->size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000223 return 0;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000224
225 nomemory:
226 self->size = 0;
227 PyErr_NoMemory();
228 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000229}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000230
Tim Peterse0a39072003-02-03 15:45:56 +0000231/* D is a Pdata*. Pop the topmost element and store it into V, which
232 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
Tim Peters1d63c9f2003-02-02 20:29:39 +0000233 * is raised and V is set to NULL. D and V may be evaluated several times.
234 */
235#define PDATA_POP(D, V) { \
Tim Peterse0a39072003-02-03 15:45:56 +0000236 if ((D)->length) \
237 (V) = (D)->data[--((D)->length)]; \
238 else { \
239 PyErr_SetString(UnpicklingError, "bad pickle data"); \
240 (V) = NULL; \
241 } \
Guido van Rossum053b8df1998-11-25 16:18:00 +0000242}
243
Tim Peterse0a39072003-02-03 15:45:56 +0000244/* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata*
245 * D. If the Pdata stack can't be grown to hold the new value, both
246 * raise MemoryError and execute "return ER". The difference is in ownership
247 * of O after: _PUSH transfers ownership of O from the caller to the stack
248 * (no incref of O is done, and in case of error O is decrefed), while
249 * _APPEND pushes a new reference.
250 */
251
252/* Push O on stack D, giving ownership of O to the stack. */
253#define PDATA_PUSH(D, O, ER) { \
254 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
255 Pdata_grow((Pdata*)(D)) < 0) { \
256 Py_DECREF(O); \
257 return ER; \
258 } \
259 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
260}
261
262/* Push O on stack D, pushing a new reference. */
263#define PDATA_APPEND(D, O, ER) { \
264 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
265 Pdata_grow((Pdata*)(D)) < 0) \
266 return ER; \
267 Py_INCREF(O); \
268 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
269}
270
271
Guido van Rossum053b8df1998-11-25 16:18:00 +0000272static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000273Pdata_popTuple(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000274{
275 PyObject *r;
276 int i, j, l;
Tim Peterscba30e22003-02-01 06:24:36 +0000277
Tim Peters1d63c9f2003-02-02 20:29:39 +0000278 l = self->length-start;
279 r = PyTuple_New(l);
280 if (r == NULL)
281 return NULL;
282 for (i = start, j = 0 ; j < l; i++, j++)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000283 PyTuple_SET_ITEM(r, j, self->data[i]);
Tim Peterscba30e22003-02-01 06:24:36 +0000284
Tim Peters1d63c9f2003-02-02 20:29:39 +0000285 self->length = start;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000286 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000287}
288
289static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000290Pdata_popList(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000291{
292 PyObject *r;
293 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000294
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000295 l=self->length-start;
296 if (!( r=PyList_New(l))) return NULL;
297 for (i=start, j=0 ; j < l; i++, j++)
298 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000300 self->length=start;
301 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000302}
303
Guido van Rossum053b8df1998-11-25 16:18:00 +0000304/*************************************************************************/
305
306#define ARG_TUP(self, o) { \
307 if (self->arg || (self->arg=PyTuple_New(1))) { \
308 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
309 PyTuple_SET_ITEM(self->arg,0,o); \
310 } \
311 else { \
312 Py_DECREF(o); \
313 } \
314}
315
316#define FREE_ARG_TUP(self) { \
317 if (self->arg->ob_refcnt > 1) { \
318 Py_DECREF(self->arg); \
319 self->arg=NULL; \
320 } \
321 }
322
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000323typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000324 PyObject_HEAD
325 FILE *fp;
326 PyObject *write;
327 PyObject *file;
328 PyObject *memo;
329 PyObject *arg;
330 PyObject *pers_func;
331 PyObject *inst_pers_func;
Tim Peters797ec242003-02-01 06:22:36 +0000332
333 /* pickle protocol number, >= 0 */
334 int proto;
335
336 /* bool, true if proto > 0 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000337 int bin;
Tim Peters797ec242003-02-01 06:22:36 +0000338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000339 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis5a395302002-08-04 08:20:23 +0000340 int nesting;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000341 int (*write_func)(struct Picklerobject *, char *, int);
342 char *write_buf;
343 int buf_size;
344 PyObject *dispatch_table;
345 int fast_container; /* count nested container dumps */
346 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000347} Picklerobject;
348
Barry Warsaw52acb492001-12-21 20:04:22 +0000349#ifndef PY_CPICKLE_FAST_LIMIT
350#define PY_CPICKLE_FAST_LIMIT 50
351#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000352
Jeremy Hylton938ace62002-07-17 16:30:39 +0000353static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000354
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000355typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000356 PyObject_HEAD
357 FILE *fp;
358 PyObject *file;
359 PyObject *readline;
360 PyObject *read;
361 PyObject *memo;
362 PyObject *arg;
363 Pdata *stack;
364 PyObject *mark;
365 PyObject *pers_func;
366 PyObject *last_string;
367 int *marks;
368 int num_marks;
369 int marks_size;
370 int (*read_func)(struct Unpicklerobject *, char **, int);
371 int (*readline_func)(struct Unpicklerobject *, char **);
372 int buf_size;
373 char *buf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000374 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000375} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000376
Jeremy Hylton938ace62002-07-17 16:30:39 +0000377static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000378
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000379/* Forward decls that need the above structs */
380static int save(Picklerobject *, PyObject *, int);
381static int put2(Picklerobject *, PyObject *);
382
Guido van Rossumd385d591997-04-09 17:47:47 +0000383static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000384PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000385cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
386{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000387 va_list va;
388 PyObject *args=0, *retval=0;
389 va_start(va, format);
Tim Peterscba30e22003-02-01 06:24:36 +0000390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000391 if (format) args = Py_VaBuildValue(format, va);
392 va_end(va);
393 if (format && ! args) return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000394 if (stringformat && !(retval=PyString_FromString(stringformat)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000395 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000397 if (retval) {
398 if (args) {
399 PyObject *v;
400 v=PyString_Format(retval, args);
401 Py_DECREF(retval);
402 Py_DECREF(args);
403 if (! v) return NULL;
404 retval=v;
405 }
406 }
407 else
408 if (args) retval=args;
409 else {
410 PyErr_SetObject(ErrType,Py_None);
411 return NULL;
412 }
413 PyErr_SetObject(ErrType,retval);
414 Py_DECREF(retval);
415 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000416}
417
Tim Peters84e87f32001-03-17 04:50:51 +0000418static int
Tim Peterscba30e22003-02-01 06:24:36 +0000419write_file(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000420{
421 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000423 if (s == NULL) {
424 return 0;
425 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000427 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000428 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000429 Py_END_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000430 if (nbyteswritten != (size_t)n) {
431 PyErr_SetFromErrno(PyExc_IOError);
432 return -1;
433 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000434
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000435 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000436}
437
Tim Peters84e87f32001-03-17 04:50:51 +0000438static int
Tim Peterscba30e22003-02-01 06:24:36 +0000439write_cStringIO(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000440{
441 if (s == NULL) {
442 return 0;
443 }
Tim Peterscba30e22003-02-01 06:24:36 +0000444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000445 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
446 return -1;
447 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000448
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000449 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000450}
451
Tim Peters84e87f32001-03-17 04:50:51 +0000452static int
Tim Peterscba30e22003-02-01 06:24:36 +0000453write_none(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000454{
455 if (s == NULL) return 0;
456 return n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000457}
458
Tim Peters84e87f32001-03-17 04:50:51 +0000459static int
Tim Peterscba30e22003-02-01 06:24:36 +0000460write_other(Picklerobject *self, char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000461{
462 PyObject *py_str = 0, *junk = 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000464 if (s == NULL) {
465 if (!( self->buf_size )) return 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000466 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000467 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000468 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000469 return -1;
470 }
471 else {
472 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
473 if (write_other(self, NULL, 0) < 0)
474 return -1;
475 }
Tim Peterscba30e22003-02-01 06:24:36 +0000476
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000477 if (n > WRITE_BUF_SIZE) {
478 if (!( py_str =
Tim Peterscba30e22003-02-01 06:24:36 +0000479 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000480 return -1;
481 }
482 else {
483 memcpy(self->write_buf + self->buf_size, s, n);
484 self->buf_size += n;
485 return n;
486 }
487 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000489 if (self->write) {
490 /* object with write method */
491 ARG_TUP(self, py_str);
492 if (self->arg) {
493 junk = PyObject_Call(self->write, self->arg, NULL);
494 FREE_ARG_TUP(self);
495 }
496 if (junk) Py_DECREF(junk);
497 else return -1;
498 }
499 else
500 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000501
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000502 self->buf_size = 0;
503 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000504}
505
506
Tim Peters84e87f32001-03-17 04:50:51 +0000507static int
Tim Petersee1a53c2003-02-02 02:57:53 +0000508read_file(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000509{
510 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000512 if (self->buf_size == 0) {
513 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000515 size = ((n < 32) ? 32 : n);
Tim Petersee1a53c2003-02-02 02:57:53 +0000516 if (!( self->buf = (char *)malloc(size))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000517 PyErr_NoMemory();
518 return -1;
519 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000521 self->buf_size = size;
522 }
523 else if (n > self->buf_size) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000524 self->buf = (char *)realloc(self->buf, n);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000525 if (!self->buf) {
526 PyErr_NoMemory();
527 return -1;
528 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000529 self->buf_size = n;
530 }
Tim Peters84e87f32001-03-17 04:50:51 +0000531
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000532 Py_BEGIN_ALLOW_THREADS
533 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
534 Py_END_ALLOW_THREADS
535 if (nbytesread != (size_t)n) {
536 if (feof(self->fp)) {
537 PyErr_SetNone(PyExc_EOFError);
538 return -1;
539 }
Tim Peterscba30e22003-02-01 06:24:36 +0000540
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000541 PyErr_SetFromErrno(PyExc_IOError);
542 return -1;
543 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000545 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000546
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000547 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000548}
549
550
Tim Peters84e87f32001-03-17 04:50:51 +0000551static int
Tim Peterscba30e22003-02-01 06:24:36 +0000552readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000553{
554 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000556 if (self->buf_size == 0) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000557 if (!( self->buf = (char *)malloc(40))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000558 PyErr_NoMemory();
559 return -1;
560 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000561 self->buf_size = 40;
562 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000564 i = 0;
565 while (1) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000566 int bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000567 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000568 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000569 (self->buf[i] = getc(self->fp)) == '\n') {
570 self->buf[i + 1] = '\0';
571 *s = self->buf;
572 return i + 1;
573 }
574 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000575 bigger = self->buf_size << 1;
576 if (bigger <= 0) { /* overflow */
577 PyErr_NoMemory();
578 return -1;
579 }
580 self->buf = (char *)realloc(self->buf, bigger);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000581 if (!self->buf) {
582 PyErr_NoMemory();
583 return -1;
584 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000585 self->buf_size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000586 }
Tim Peters84e87f32001-03-17 04:50:51 +0000587}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000588
589
Tim Peters84e87f32001-03-17 04:50:51 +0000590static int
Tim Peterscba30e22003-02-01 06:24:36 +0000591read_cStringIO(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000592{
593 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000594
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000595 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
596 PyErr_SetNone(PyExc_EOFError);
597 return -1;
598 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000599
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000600 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000602 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000603}
604
605
Tim Peters84e87f32001-03-17 04:50:51 +0000606static int
Tim Peterscba30e22003-02-01 06:24:36 +0000607readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000608{
609 int n;
610 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000612 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
613 return -1;
614 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000615
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000616 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000617
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000618 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000619}
620
621
Tim Peters84e87f32001-03-17 04:50:51 +0000622static int
Tim Peterscba30e22003-02-01 06:24:36 +0000623read_other(Unpicklerobject *self, char **s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000624{
625 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000627 if (!( bytes = PyInt_FromLong(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000628
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000629 ARG_TUP(self, bytes);
630 if (self->arg) {
631 str = PyObject_Call(self->read, self->arg, NULL);
632 FREE_ARG_TUP(self);
633 }
634 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000635
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000636 Py_XDECREF(self->last_string);
637 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000638
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000639 if (! (*s = PyString_AsString(str))) return -1;
640 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000641}
642
643
Tim Peters84e87f32001-03-17 04:50:51 +0000644static int
Tim Peterscba30e22003-02-01 06:24:36 +0000645readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000646{
647 PyObject *str;
648 int str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000649
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000650 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
651 return -1;
652 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000654 if ((str_size = PyString_Size(str)) < 0)
655 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000657 Py_XDECREF(self->last_string);
658 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000659
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000660 if (! (*s = PyString_AsString(str)))
661 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000662
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000663 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000664}
665
Tim Petersee1a53c2003-02-02 02:57:53 +0000666/* Copy the first n bytes from s into newly malloc'ed memory, plus a
667 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
668 * The caller is responsible for free()'ing the return value.
669 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000670static char *
Tim Petersee1a53c2003-02-02 02:57:53 +0000671pystrndup(char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000672{
Tim Petersee1a53c2003-02-02 02:57:53 +0000673 char *r = (char *)malloc(n+1);
674 if (r == NULL)
675 return (char*)PyErr_NoMemory();
676 memcpy(r, s, n);
677 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000678 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000679}
680
681
682static int
Tim Peterscba30e22003-02-01 06:24:36 +0000683get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000684{
685 PyObject *value, *mv;
686 long c_value;
687 char s[30];
688 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000690 if (!( mv = PyDict_GetItem(self->memo, id))) {
691 PyErr_SetObject(PyExc_KeyError, id);
692 return -1;
693 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000694
Tim Peterscba30e22003-02-01 06:24:36 +0000695 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000696 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000698 if (!( PyInt_Check(value))) {
699 PyErr_SetString(PicklingError, "no int where int expected in memo");
700 return -1;
701 }
702 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000703
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000704 if (!self->bin) {
705 s[0] = GET;
706 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
707 len = strlen(s);
708 }
709 else if (Pdata_Check(self->file)) {
710 if (write_other(self, NULL, 0) < 0) return -1;
711 PDATA_APPEND(self->file, mv, -1);
712 return 0;
713 }
714 else {
715 if (c_value < 256) {
716 s[0] = BINGET;
717 s[1] = (int)(c_value & 0xff);
718 len = 2;
719 }
720 else {
721 s[0] = LONG_BINGET;
722 s[1] = (int)(c_value & 0xff);
723 s[2] = (int)((c_value >> 8) & 0xff);
724 s[3] = (int)((c_value >> 16) & 0xff);
725 s[4] = (int)((c_value >> 24) & 0xff);
726 len = 5;
727 }
728 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000729
Tim Peters0bc93f52003-02-02 18:29:33 +0000730 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000731 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000732
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000733 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000734}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000735
Guido van Rossum60456fd1997-04-09 17:36:32 +0000736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000737static int
Tim Peterscba30e22003-02-01 06:24:36 +0000738put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000739{
Tim Peterscba30e22003-02-01 06:24:36 +0000740 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000741 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000742
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000743 return put2(self, ob);
744}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000745
Guido van Rossum053b8df1998-11-25 16:18:00 +0000746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000747static int
Tim Peterscba30e22003-02-01 06:24:36 +0000748put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000749{
750 char c_str[30];
751 int p;
752 size_t len;
753 int res = -1;
754 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000756 if (self->fast)
757 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000759 if ((p = PyDict_Size(self->memo)) < 0)
760 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000762 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000763 /* XXX Why?
764 * XXX And does "positive" really mean non-negative?
765 * XXX pickle.py starts with PUT index 0, not 1. This makes for
766 * XXX gratuitous differences between the pickling modules.
767 */
Tim Peterscba30e22003-02-01 06:24:36 +0000768 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000769
Tim Peterscba30e22003-02-01 06:24:36 +0000770 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000771 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000772
Tim Peterscba30e22003-02-01 06:24:36 +0000773 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000774 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000775
Tim Peterscba30e22003-02-01 06:24:36 +0000776 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000777 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000779 PyTuple_SET_ITEM(t, 0, memo_len);
780 Py_INCREF(memo_len);
781 PyTuple_SET_ITEM(t, 1, ob);
782 Py_INCREF(ob);
783
784 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
785 goto finally;
786
787 if (!self->bin) {
788 c_str[0] = PUT;
789 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
790 len = strlen(c_str);
791 }
792 else if (Pdata_Check(self->file)) {
793 if (write_other(self, NULL, 0) < 0) return -1;
794 PDATA_APPEND(self->file, memo_len, -1);
795 res=0; /* Job well done ;) */
796 goto finally;
797 }
798 else {
799 if (p >= 256) {
800 c_str[0] = LONG_BINPUT;
801 c_str[1] = (int)(p & 0xff);
802 c_str[2] = (int)((p >> 8) & 0xff);
803 c_str[3] = (int)((p >> 16) & 0xff);
804 c_str[4] = (int)((p >> 24) & 0xff);
805 len = 5;
806 }
807 else {
808 c_str[0] = BINPUT;
809 c_str[1] = p;
810 len = 2;
811 }
812 }
813
Tim Peters0bc93f52003-02-02 18:29:33 +0000814 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000815 goto finally;
816
817 res = 0;
818
819 finally:
820 Py_XDECREF(py_ob_id);
821 Py_XDECREF(memo_len);
822 Py_XDECREF(t);
823
824 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000825}
826
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000827static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000828whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000829{
830 int i, j;
831 PyObject *module = 0, *modules_dict = 0,
832 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000834 module = PyObject_GetAttrString(global, "__module__");
835 if (module) return module;
836 PyErr_Clear();
Guido van Rossum45188231997-09-28 05:38:51 +0000837
Tim Peterscba30e22003-02-01 06:24:36 +0000838 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000839 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000840
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000841 i = 0;
842 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000843
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000844 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000846 global_name_attr = PyObject_GetAttr(module, global_name);
847 if (!global_name_attr) {
848 PyErr_Clear();
849 continue;
850 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000852 if (global_name_attr != global) {
853 Py_DECREF(global_name_attr);
854 continue;
855 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000857 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000859 break;
860 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000862 /* The following implements the rule in pickle.py added in 1.5
863 that used __main__ if no module is found. I don't actually
864 like this rule. jlf
865 */
866 if (!j) {
867 j=1;
868 name=__main___str;
869 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000870
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000871 Py_INCREF(name);
872 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000873}
874
875
Guido van Rossum60456fd1997-04-09 17:36:32 +0000876static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000877fast_save_enter(Picklerobject *self, PyObject *obj)
878{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000879 /* if fast_container < 0, we're doing an error exit. */
880 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
881 PyObject *key = NULL;
882 if (self->fast_memo == NULL) {
883 self->fast_memo = PyDict_New();
884 if (self->fast_memo == NULL) {
885 self->fast_container = -1;
886 return 0;
887 }
888 }
889 key = PyLong_FromVoidPtr(obj);
890 if (key == NULL)
891 return 0;
892 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000893 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000894 PyErr_Format(PyExc_ValueError,
Tim Peters92c8bb32003-02-13 23:00:26 +0000895 "fast mode: can't pickle cyclic objects "
896 "including object type %s at %p",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000897 obj->ob_type->tp_name, obj);
898 self->fast_container = -1;
899 return 0;
900 }
901 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000902 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000903 self->fast_container = -1;
904 return 0;
905 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000906 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000907 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000908 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000909}
910
Tim Peterscba30e22003-02-01 06:24:36 +0000911int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000912fast_save_leave(Picklerobject *self, PyObject *obj)
913{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000914 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
915 PyObject *key = PyLong_FromVoidPtr(obj);
916 if (key == NULL)
917 return 0;
918 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000919 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000920 return 0;
921 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000922 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000923 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000924 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000925}
926
927static int
Tim Peterscba30e22003-02-01 06:24:36 +0000928save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000929{
930 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000931 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000932 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000933
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000934 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000935}
936
Guido van Rossum77f6a652002-04-03 22:41:51 +0000937static int
Tim Peterscba30e22003-02-01 06:24:36 +0000938save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000939{
Guido van Rossume2763392002-04-05 19:30:08 +0000940 static char *buf[2] = {FALSE, TRUE};
941 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000942 long l = PyInt_AS_LONG((PyIntObject *)args);
943
Tim Peters3c67d792003-02-02 17:59:11 +0000944 if (self->proto >= 2) {
945 char opcode = l ? NEWTRUE : NEWFALSE;
946 if (self->write_func(self, &opcode, 1) < 0)
947 return -1;
948 }
949 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000950 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000951 return 0;
952}
Tim Peters84e87f32001-03-17 04:50:51 +0000953
Guido van Rossum60456fd1997-04-09 17:36:32 +0000954static int
Tim Peterscba30e22003-02-01 06:24:36 +0000955save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000956{
957 char c_str[32];
958 long l = PyInt_AS_LONG((PyIntObject *)args);
959 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000960
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000961 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000962#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000963 || l > 0x7fffffffL
964 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000965#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000966 ) {
967 /* Text-mode pickle, or long too big to fit in the 4-byte
968 * signed BININT format: store as a string.
969 */
970 c_str[0] = INT;
971 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +0000972 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000973 return -1;
974 }
975 else {
976 /* Binary pickle and l fits in a signed 4-byte int. */
977 c_str[1] = (int)( l & 0xff);
978 c_str[2] = (int)((l >> 8) & 0xff);
979 c_str[3] = (int)((l >> 16) & 0xff);
980 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000981
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000982 if ((c_str[4] == 0) && (c_str[3] == 0)) {
983 if (c_str[2] == 0) {
984 c_str[0] = BININT1;
985 len = 2;
986 }
987 else {
988 c_str[0] = BININT2;
989 len = 3;
990 }
991 }
992 else {
993 c_str[0] = BININT;
994 len = 5;
995 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000996
Tim Peters0bc93f52003-02-02 18:29:33 +0000997 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000998 return -1;
999 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001001 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001002}
1003
1004
1005static int
Tim Peterscba30e22003-02-01 06:24:36 +00001006save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001007{
Tim Petersee1a53c2003-02-02 02:57:53 +00001008 int size;
1009 int res = -1;
1010 PyObject *repr = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001011
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001012 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001013
Tim Petersee1a53c2003-02-02 02:57:53 +00001014 if (self->proto >= 2) {
1015 /* Linear-time pickling. */
1016 size_t nbits;
1017 size_t nbytes;
1018 unsigned char *pdata;
1019 char c_str[5];
1020 int i;
1021 int sign = _PyLong_Sign(args);
1022
1023 if (sign == 0) {
1024 /* It's 0 -- an empty bytestring. */
1025 c_str[0] = LONG1;
1026 c_str[1] = 0;
1027 i = self->write_func(self, c_str, 2);
1028 if (i < 0) goto finally;
1029 res = 0;
1030 goto finally;
1031 }
1032 nbits = _PyLong_NumBits(args);
1033 if (nbits == (size_t)-1 && PyErr_Occurred())
1034 goto finally;
1035 /* How many bytes do we need? There are nbits >> 3 full
1036 * bytes of data, and nbits & 7 leftover bits. If there
1037 * are any leftover bits, then we clearly need another
1038 * byte. Wnat's not so obvious is that we *probably*
1039 * need another byte even if there aren't any leftovers:
1040 * the most-significant bit of the most-significant byte
1041 * acts like a sign bit, and it's usually got a sense
1042 * opposite of the one we need. The exception is longs
1043 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1044 * its own 256's-complement, so has the right sign bit
1045 * even without the extra byte. That's a pain to check
1046 * for in advance, though, so we always grab an extra
1047 * byte at the start, and cut it back later if possible.
1048 */
1049 nbytes = (nbits >> 3) + 1;
1050 if ((int)nbytes < 0 || (size_t)(int)nbytes != nbytes) {
1051 PyErr_SetString(PyExc_OverflowError, "long too large "
1052 "to pickle");
1053 goto finally;
1054 }
1055 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
1056 if (repr == NULL) goto finally;
1057 pdata = (unsigned char *)PyString_AS_STRING(repr);
1058 i = _PyLong_AsByteArray((PyLongObject *)args,
1059 pdata, nbytes,
1060 1 /* little endian */, 1 /* signed */);
1061 if (i < 0) goto finally;
1062 /* If the long is negative, this may be a byte more than
1063 * needed. This is so iff the MSB is all redundant sign
1064 * bits.
1065 */
1066 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1067 (pdata[nbytes - 2] & 0x80) != 0)
1068 --nbytes;
1069
1070 if (nbytes < 256) {
1071 c_str[0] = LONG1;
1072 c_str[1] = (char)nbytes;
1073 size = 2;
1074 }
1075 else {
1076 c_str[0] = LONG4;
1077 size = (int)nbytes;
1078 for (i = 1; i < 5; i++) {
1079 c_str[i] = (char)(size & 0xff);
1080 size >>= 8;
1081 }
1082 size = 5;
1083 }
1084 i = self->write_func(self, c_str, size);
1085 if (i < 0) goto finally;
1086 i = self->write_func(self, (char *)pdata, (int)nbytes);
1087 if (i < 0) goto finally;
1088 res = 0;
1089 goto finally;
1090 }
1091
1092 /* proto < 2: write the repr and newline. This is quadratic-time
1093 * (in the number of digits), in both directions.
1094 */
Tim Peterscba30e22003-02-01 06:24:36 +00001095 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001096 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001097
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001098 if ((size = PyString_Size(repr)) < 0)
1099 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001100
Tim Peters0bc93f52003-02-02 18:29:33 +00001101 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001102 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001103
Tim Peters0bc93f52003-02-02 18:29:33 +00001104 if (self->write_func(self,
1105 PyString_AS_STRING((PyStringObject *)repr),
1106 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001107 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001108
Tim Peters0bc93f52003-02-02 18:29:33 +00001109 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001110 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001111
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001112 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001114 finally:
1115 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001116 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001117}
1118
1119
1120static int
Tim Peterscba30e22003-02-01 06:24:36 +00001121save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001122{
1123 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001125 if (self->bin) {
1126 int s, e;
1127 double f;
1128 long fhi, flo;
1129 char str[9];
1130 unsigned char *p = (unsigned char *)str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001132 *p = BINFLOAT;
1133 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001135 if (x < 0) {
1136 s = 1;
1137 x = -x;
1138 }
1139 else
1140 s = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001142 f = frexp(x, &e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001144 /* Normalize f to be in the range [1.0, 2.0) */
1145 if (0.5 <= f && f < 1.0) {
1146 f *= 2.0;
1147 e--;
1148 }
1149 else if (f == 0.0) {
1150 e = 0;
1151 }
1152 else {
1153 PyErr_SetString(PyExc_SystemError,
1154 "frexp() result out of range");
1155 return -1;
1156 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001157
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001158 if (e >= 1024) {
1159 /* XXX 1024 itself is reserved for Inf/NaN */
1160 PyErr_SetString(PyExc_OverflowError,
1161 "float too large to pack with d format");
1162 return -1;
1163 }
1164 else if (e < -1022) {
1165 /* Gradual underflow */
1166 f = ldexp(f, 1022 + e);
1167 e = 0;
1168 }
1169 else if (!(e == 0 && f == 0.0)) {
1170 e += 1023;
1171 f -= 1.0; /* Get rid of leading 1 */
1172 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001173
Tim Peterscba30e22003-02-01 06:24:36 +00001174 /* fhi receives the high 28 bits;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001175 flo the low 24 bits (== 52 bits) */
1176 f *= 268435456.0; /* 2**28 */
1177 fhi = (long) floor(f); /* Truncate */
1178 f -= (double)fhi;
1179 f *= 16777216.0; /* 2**24 */
1180 flo = (long) floor(f + 0.5); /* Round */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001182 /* First byte */
1183 *p = (s<<7) | (e>>4);
1184 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001185
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001186 /* Second byte */
1187 *p = (unsigned char) (((e&0xF)<<4) | (fhi>>24));
1188 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001190 /* Third byte */
1191 *p = (unsigned char) ((fhi>>16) & 0xFF);
1192 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001194 /* Fourth byte */
1195 *p = (unsigned char) ((fhi>>8) & 0xFF);
1196 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001197
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001198 /* Fifth byte */
1199 *p = (unsigned char) (fhi & 0xFF);
1200 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001202 /* Sixth byte */
1203 *p = (unsigned char) ((flo>>16) & 0xFF);
1204 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001206 /* Seventh byte */
1207 *p = (unsigned char) ((flo>>8) & 0xFF);
1208 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001209
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001210 /* Eighth byte */
1211 *p = (unsigned char) (flo & 0xFF);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001212
Tim Peters0bc93f52003-02-02 18:29:33 +00001213 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001214 return -1;
1215 }
1216 else {
1217 char c_str[250];
1218 c_str[0] = FLOAT;
1219 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%.17g\n", x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001220
Tim Peters0bc93f52003-02-02 18:29:33 +00001221 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001222 return -1;
1223 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001224
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001225 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001226}
1227
1228
1229static int
Tim Peterscba30e22003-02-01 06:24:36 +00001230save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001231{
1232 int size, len;
1233 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001235 if ((size = PyString_Size(args)) < 0)
1236 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001237
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001238 if (!self->bin) {
1239 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001240
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001241 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001242
Tim Peterscba30e22003-02-01 06:24:36 +00001243 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001244 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001245
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001246 if ((len = PyString_Size(repr)) < 0)
1247 goto err;
1248 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001249
Tim Peters0bc93f52003-02-02 18:29:33 +00001250 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001251 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001252
Tim Peters0bc93f52003-02-02 18:29:33 +00001253 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001254 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001255
Tim Peters0bc93f52003-02-02 18:29:33 +00001256 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001257 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001259 Py_XDECREF(repr);
1260 }
1261 else {
1262 int i;
1263 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001265 if ((size = PyString_Size(args)) < 0)
1266 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001268 if (size < 256) {
1269 c_str[0] = SHORT_BINSTRING;
1270 c_str[1] = size;
1271 len = 2;
1272 }
1273 else {
1274 c_str[0] = BINSTRING;
1275 for (i = 1; i < 5; i++)
1276 c_str[i] = (int)(size >> ((i - 1) * 8));
1277 len = 5;
1278 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001279
Tim Peters0bc93f52003-02-02 18:29:33 +00001280 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001281 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001282
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001283 if (size > 128 && Pdata_Check(self->file)) {
1284 if (write_other(self, NULL, 0) < 0) return -1;
1285 PDATA_APPEND(self->file, args, -1);
1286 }
1287 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001288 if (self->write_func(self,
1289 PyString_AS_STRING(
1290 (PyStringObject *)args),
1291 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001292 return -1;
1293 }
1294 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001295
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001296 if (doput)
1297 if (put(self, args) < 0)
1298 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001300 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001302 err:
1303 Py_XDECREF(repr);
1304 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001305}
1306
1307
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001308#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001309/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1310 backslash and newline characters to \uXXXX escapes. */
1311static PyObject *
1312modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1313{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001314 PyObject *repr;
1315 char *p;
1316 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001317
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001318 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001319
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001320 repr = PyString_FromStringAndSize(NULL, 6 * size);
1321 if (repr == NULL)
1322 return NULL;
1323 if (size == 0)
1324 return repr;
1325
1326 p = q = PyString_AS_STRING(repr);
1327 while (size-- > 0) {
1328 Py_UNICODE ch = *s++;
1329 /* Map 16-bit characters to '\uxxxx' */
1330 if (ch >= 256 || ch == '\\' || ch == '\n') {
1331 *p++ = '\\';
1332 *p++ = 'u';
1333 *p++ = hexdigit[(ch >> 12) & 0xf];
1334 *p++ = hexdigit[(ch >> 8) & 0xf];
1335 *p++ = hexdigit[(ch >> 4) & 0xf];
1336 *p++ = hexdigit[ch & 15];
1337 }
1338 /* Copy everything else as-is */
1339 else
1340 *p++ = (char) ch;
1341 }
1342 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001343 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001344 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001345}
1346
1347
Guido van Rossum60456fd1997-04-09 17:36:32 +00001348static int
Tim Peterscba30e22003-02-01 06:24:36 +00001349save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001350{
1351 int size, len;
1352 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001353
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001354 if (!PyUnicode_Check(args))
1355 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001356
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001357 if (!self->bin) {
1358 char *repr_str;
1359 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001361 repr = modified_EncodeRawUnicodeEscape(
1362 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001363 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001364 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001365
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001366 if ((len = PyString_Size(repr)) < 0)
1367 goto err;
1368 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001369
Tim Peters0bc93f52003-02-02 18:29:33 +00001370 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001371 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001372
Tim Peters0bc93f52003-02-02 18:29:33 +00001373 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001374 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001375
Tim Peters0bc93f52003-02-02 18:29:33 +00001376 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001377 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001378
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001379 Py_XDECREF(repr);
1380 }
1381 else {
1382 int i;
1383 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001384
Tim Peterscba30e22003-02-01 06:24:36 +00001385 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001386 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001387
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001388 if ((size = PyString_Size(repr)) < 0)
1389 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001391 c_str[0] = BINUNICODE;
1392 for (i = 1; i < 5; i++)
1393 c_str[i] = (int)(size >> ((i - 1) * 8));
1394 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001395
Tim Peters0bc93f52003-02-02 18:29:33 +00001396 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001397 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001399 if (size > 128 && Pdata_Check(self->file)) {
1400 if (write_other(self, NULL, 0) < 0)
1401 goto err;
1402 PDATA_APPEND(self->file, repr, -1);
1403 }
1404 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001405 if (self->write_func(self, PyString_AS_STRING(repr),
1406 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001407 goto err;
1408 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001409
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001410 Py_DECREF(repr);
1411 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001413 if (doput)
1414 if (put(self, args) < 0)
1415 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001417 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001419 err:
1420 Py_XDECREF(repr);
1421 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001422}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001423#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001424
Tim Peters1d63c9f2003-02-02 20:29:39 +00001425/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1426static int
Tim Peters67920142003-02-05 03:46:17 +00001427store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001428{
1429 int i;
1430 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001431
Tim Peters1d63c9f2003-02-02 20:29:39 +00001432 assert(PyTuple_Size(t) == len);
1433
1434 for (i = 0; i < len; i++) {
1435 PyObject *element = PyTuple_GET_ITEM(t, i);
1436
1437 if (element == NULL)
1438 goto finally;
1439 if (save(self, element, 0) < 0)
1440 goto finally;
1441 }
1442 res = 0;
1443
1444 finally:
1445 return res;
1446}
1447
1448/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1449 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001450 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001451 * (a tuple can be reached from itself), and that requires some subtle
1452 * magic so that it works in all cases. IOW, this is a long routine.
1453 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001454static int
Tim Peterscba30e22003-02-01 06:24:36 +00001455save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001456{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001457 PyObject *py_tuple_id = NULL;
1458 int len, i;
1459 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001461 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001462 static char pop = POP;
1463 static char pop_mark = POP_MARK;
1464 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001466 if ((len = PyTuple_Size(args)) < 0)
1467 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001468
Tim Peters1d63c9f2003-02-02 20:29:39 +00001469 if (len == 0) {
1470 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001471
Tim Peters1d63c9f2003-02-02 20:29:39 +00001472 if (self->proto) {
1473 c_str[0] = EMPTY_TUPLE;
1474 len = 1;
1475 }
1476 else {
1477 c_str[0] = MARK;
1478 c_str[1] = TUPLE;
1479 len = 2;
1480 }
1481 if (self->write_func(self, c_str, len) >= 0)
1482 res = 0;
1483 /* Don't memoize an empty tuple. */
1484 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001485 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001486
Tim Peters1d63c9f2003-02-02 20:29:39 +00001487 /* A non-empty tuple. */
1488
1489 /* id(tuple) isn't in the memo now. If it shows up there after
1490 * saving the tuple elements, the tuple must be recursive, in
1491 * which case we'll pop everything we put on the stack, and fetch
1492 * its value from the memo.
1493 */
1494 py_tuple_id = PyLong_FromVoidPtr(args);
1495 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001496 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001497
Tim Peters1d63c9f2003-02-02 20:29:39 +00001498 if (len <= 3 && self->proto >= 2) {
1499 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001500 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001501 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001502 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001503 /* pop the len elements */
1504 for (i = 0; i < len; ++i)
1505 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001506 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001507 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001508 if (get(self, py_tuple_id) < 0)
1509 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001510 res = 0;
1511 goto finally;
1512 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001513 /* Not recursive. */
1514 if (self->write_func(self, len2opcode + len, 1) < 0)
1515 goto finally;
1516 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001517 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001518
Tim Peters1d63c9f2003-02-02 20:29:39 +00001519 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1520 * Generate MARK elt1 elt2 ... TUPLE
1521 */
1522 if (self->write_func(self, &MARKv, 1) < 0)
1523 goto finally;
1524
Tim Peters67920142003-02-05 03:46:17 +00001525 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001526 goto finally;
1527
1528 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1529 /* pop the stack stuff we pushed */
1530 if (self->bin) {
1531 if (self->write_func(self, &pop_mark, 1) < 0)
1532 goto finally;
1533 }
1534 else {
1535 /* Note that we pop one more than len, to remove
1536 * the MARK too.
1537 */
1538 for (i = 0; i <= len; i++)
1539 if (self->write_func(self, &pop, 1) < 0)
1540 goto finally;
1541 }
1542 /* fetch from memo */
1543 if (get(self, py_tuple_id) >= 0)
1544 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001545 goto finally;
1546 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001547
Tim Peters1d63c9f2003-02-02 20:29:39 +00001548 /* Not recursive. */
1549 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001550 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001551
Tim Peters1d63c9f2003-02-02 20:29:39 +00001552 memoize:
1553 if (put(self, args) >= 0)
1554 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001556 finally:
1557 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001558 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001559}
1560
Tim Peters1092d642003-02-11 21:06:20 +00001561/* iter is an iterator giving items, and we batch up chunks of
1562 * MARK item item ... item APPENDS
1563 * opcode sequences. Calling code should have arranged to first create an
1564 * empty list, or list-like object, for the APPENDS to operate on.
1565 * Returns 0 on success, <0 on error.
1566 */
1567static int
1568batch_list(Picklerobject *self, PyObject *iter)
1569{
1570 PyObject *obj;
1571 PyObject *slice[BATCHSIZE];
1572 int i, n;
1573
1574 static char append = APPEND;
1575 static char appends = APPENDS;
1576
1577 assert(iter != NULL);
1578
1579 if (self->proto == 0) {
1580 /* APPENDS isn't available; do one at a time. */
1581 for (;;) {
1582 obj = PyIter_Next(iter);
1583 if (obj == NULL) {
1584 if (PyErr_Occurred())
1585 return -1;
1586 break;
1587 }
1588 i = save(self, obj, 0);
1589 Py_DECREF(obj);
1590 if (i < 0)
1591 return -1;
1592 if (self->write_func(self, &append, 1) < 0)
1593 return -1;
Tim Peters1092d642003-02-11 21:06:20 +00001594 }
1595 return 0;
1596 }
1597
1598 /* proto > 0: write in batches of BATCHSIZE. */
1599 do {
1600 /* Get next group of (no more than) BATCHSIZE elements. */
1601 for (n = 0; n < BATCHSIZE; ++n) {
1602 obj = PyIter_Next(iter);
1603 if (obj == NULL) {
1604 if (PyErr_Occurred())
1605 goto BatchFailed;
1606 break;
1607 }
1608 slice[n] = obj;
1609 }
1610
1611 if (n > 1) {
1612 /* Pump out MARK, slice[0:n], APPENDS. */
1613 if (self->write_func(self, &MARKv, 1) < 0)
1614 goto BatchFailed;
1615 for (i = 0; i < n; ++i) {
1616 if (save(self, slice[i], 0) < 0)
1617 goto BatchFailed;
1618 }
1619 if (self->write_func(self, &appends, 1) < 0)
1620 goto BatchFailed;
1621 }
1622 else if (n == 1) {
1623 if (save(self, slice[0], 0) < 0)
1624 goto BatchFailed;
1625 if (self->write_func(self, &append, 1) < 0)
1626 goto BatchFailed;
1627 }
1628
1629 for (i = 0; i < n; ++i) {
1630 Py_DECREF(slice[i]);
1631 }
Tim Peters90975f12003-02-12 05:28:58 +00001632 } while (n == BATCHSIZE);
Tim Peters1092d642003-02-11 21:06:20 +00001633 return 0;
1634
1635BatchFailed:
1636 while (--n >= 0) {
1637 Py_DECREF(slice[n]);
1638 }
1639 return -1;
1640}
1641
Guido van Rossum60456fd1997-04-09 17:36:32 +00001642static int
Tim Peterscba30e22003-02-01 06:24:36 +00001643save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001644{
Tim Peters1092d642003-02-11 21:06:20 +00001645 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001646 char s[3];
Tim Peters1092d642003-02-11 21:06:20 +00001647 int len;
1648 PyObject *iter;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001649
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001650 if (self->fast && !fast_save_enter(self, args))
1651 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001652
Tim Peters1092d642003-02-11 21:06:20 +00001653 /* Create an empty list. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001654 if (self->bin) {
1655 s[0] = EMPTY_LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001656 len = 1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001657 }
1658 else {
1659 s[0] = MARK;
1660 s[1] = LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001661 len = 2;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001662 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001663
Tim Peters1092d642003-02-11 21:06:20 +00001664 if (self->write_func(self, s, len) < 0)
1665 goto finally;
1666
1667 /* Get list length, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001668 if ((len = PyList_Size(args)) < 0)
1669 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001670
Tim Peters1092d642003-02-11 21:06:20 +00001671 /* Memoize. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001672 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001673 if (put(self, args) >= 0)
1674 res = 0;
1675 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001676 }
Tim Peters90975f12003-02-12 05:28:58 +00001677 if (put2(self, args) < 0)
1678 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001679
Tim Peters1092d642003-02-11 21:06:20 +00001680 /* Materialize the list elements. */
1681 iter = PyObject_GetIter(args);
1682 if (iter == NULL)
1683 goto finally;
1684 res = batch_list(self, iter);
1685 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001687 finally:
1688 if (self->fast && !fast_save_leave(self, args))
1689 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001691 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001692}
1693
1694
Tim Peters42f08ac2003-02-11 22:43:24 +00001695/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1696 * MARK key value ... key value SETITEMS
1697 * opcode sequences. Calling code should have arranged to first create an
1698 * empty dict, or dict-like object, for the SETITEMS to operate on.
1699 * Returns 0 on success, <0 on error.
1700 *
1701 * This is very much like batch_list(). The difference between saving
1702 * elements directly, and picking apart two-tuples, is so long-winded at
1703 * the C level, though, that attempts to combine these routines were too
1704 * ugly to bear.
1705 */
1706static int
1707batch_dict(Picklerobject *self, PyObject *iter)
1708{
1709 PyObject *p;
1710 PyObject *slice[BATCHSIZE];
1711 int i, n;
1712
1713 static char setitem = SETITEM;
1714 static char setitems = SETITEMS;
1715
1716 assert(iter != NULL);
1717
1718 if (self->proto == 0) {
1719 /* SETITEMS isn't available; do one at a time. */
1720 for (;;) {
1721 p = PyIter_Next(iter);
1722 if (p == NULL) {
1723 if (PyErr_Occurred())
1724 return -1;
1725 break;
1726 }
1727 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1728 PyErr_SetString(PyExc_TypeError, "dict items "
1729 "iterator must return 2-tuples");
1730 return -1;
1731 }
1732 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1733 if (i >= 0)
1734 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1735 Py_DECREF(p);
1736 if (i < 0)
1737 return -1;
1738 if (self->write_func(self, &setitem, 1) < 0)
1739 return -1;
Tim Peters42f08ac2003-02-11 22:43:24 +00001740 }
1741 return 0;
1742 }
1743
1744 /* proto > 0: write in batches of BATCHSIZE. */
1745 do {
1746 /* Get next group of (no more than) BATCHSIZE elements. */
1747 for (n = 0; n < BATCHSIZE; ++n) {
1748 p = PyIter_Next(iter);
1749 if (p == NULL) {
1750 if (PyErr_Occurred())
1751 goto BatchFailed;
1752 break;
1753 }
1754 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1755 PyErr_SetString(PyExc_TypeError, "dict items "
1756 "iterator must return 2-tuples");
1757 goto BatchFailed;
1758 }
1759 slice[n] = p;
1760 }
1761
1762 if (n > 1) {
1763 /* Pump out MARK, slice[0:n], SETITEMS. */
1764 if (self->write_func(self, &MARKv, 1) < 0)
1765 goto BatchFailed;
1766 for (i = 0; i < n; ++i) {
1767 p = slice[i];
1768 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1769 goto BatchFailed;
1770 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1771 goto BatchFailed;
1772 }
1773 if (self->write_func(self, &setitems, 1) < 0)
1774 goto BatchFailed;
1775 }
1776 else if (n == 1) {
1777 p = slice[0];
1778 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1779 goto BatchFailed;
1780 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1781 goto BatchFailed;
1782 if (self->write_func(self, &setitem, 1) < 0)
1783 goto BatchFailed;
1784 }
1785
1786 for (i = 0; i < n; ++i) {
1787 Py_DECREF(slice[i]);
1788 }
Tim Peters90975f12003-02-12 05:28:58 +00001789 } while (n == BATCHSIZE);
Tim Peters42f08ac2003-02-11 22:43:24 +00001790 return 0;
1791
1792BatchFailed:
1793 while (--n >= 0) {
1794 Py_DECREF(slice[n]);
1795 }
1796 return -1;
1797}
1798
Guido van Rossum60456fd1997-04-09 17:36:32 +00001799static int
Tim Peterscba30e22003-02-01 06:24:36 +00001800save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001801{
Tim Peters42f08ac2003-02-11 22:43:24 +00001802 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001803 char s[3];
Tim Peters42f08ac2003-02-11 22:43:24 +00001804 int len;
1805 PyObject *iter;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001806
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001807 if (self->fast && !fast_save_enter(self, args))
1808 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001809
Tim Peters42f08ac2003-02-11 22:43:24 +00001810 /* Create an empty dict. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001811 if (self->bin) {
1812 s[0] = EMPTY_DICT;
1813 len = 1;
1814 }
1815 else {
1816 s[0] = MARK;
1817 s[1] = DICT;
1818 len = 2;
1819 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001820
Tim Peters0bc93f52003-02-02 18:29:33 +00001821 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001822 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001823
Tim Peters42f08ac2003-02-11 22:43:24 +00001824 /* Get dict size, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001825 if ((len = PyDict_Size(args)) < 0)
1826 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001828 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001829 if (put(self, args) >= 0)
1830 res = 0;
1831 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001832 }
Tim Peters90975f12003-02-12 05:28:58 +00001833 if (put2(self, args) < 0)
1834 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001835
Tim Peters42f08ac2003-02-11 22:43:24 +00001836 /* Materialize the dict items. */
1837 iter = PyObject_CallMethod(args, "iteritems", "()");
1838 if (iter == NULL)
1839 goto finally;
1840 res = batch_dict(self, iter);
1841 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001842
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001843 finally:
1844 if (self->fast && !fast_save_leave(self, args))
1845 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001847 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001848}
1849
1850
Tim Peters84e87f32001-03-17 04:50:51 +00001851static int
Tim Peterscba30e22003-02-01 06:24:36 +00001852save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001853{
1854 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1855 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1856 char *module_str, *name_str;
1857 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001859 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001861 if (self->fast && !fast_save_enter(self, args))
1862 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001863
Tim Peters0bc93f52003-02-02 18:29:33 +00001864 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001865 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001866
Tim Peterscba30e22003-02-01 06:24:36 +00001867 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001868 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001870 if (self->bin) {
1871 if (save(self, class, 0) < 0)
1872 goto finally;
1873 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001874
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001875 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1876 PyObject *element = 0;
1877 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001879 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00001880 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001881 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001883 if ((len = PyObject_Size(class_args)) < 0)
1884 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001886 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001887 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001888 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001890 if (save(self, element, 0) < 0) {
1891 Py_DECREF(element);
1892 goto finally;
1893 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001895 Py_DECREF(element);
1896 }
1897 }
1898 else {
1899 PyErr_Clear();
1900 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001901
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001902 if (!self->bin) {
1903 if (!( name = ((PyClassObject *)class)->cl_name )) {
1904 PyErr_SetString(PicklingError, "class has no name");
1905 goto finally;
1906 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001907
Tim Peterscba30e22003-02-01 06:24:36 +00001908 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001909 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001910
Tim Peters84e87f32001-03-17 04:50:51 +00001911
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001912 if ((module_size = PyString_Size(module)) < 0 ||
1913 (name_size = PyString_Size(name)) < 0)
1914 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001916 module_str = PyString_AS_STRING((PyStringObject *)module);
1917 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001918
Tim Peters0bc93f52003-02-02 18:29:33 +00001919 if (self->write_func(self, &inst, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001920 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001921
Tim Peters0bc93f52003-02-02 18:29:33 +00001922 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001923 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001924
Tim Peters0bc93f52003-02-02 18:29:33 +00001925 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001926 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001927
Tim Peters0bc93f52003-02-02 18:29:33 +00001928 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001929 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001930
Tim Peters0bc93f52003-02-02 18:29:33 +00001931 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001932 goto finally;
1933 }
Tim Peters0bc93f52003-02-02 18:29:33 +00001934 else if (self->write_func(self, &obj, 1) < 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001935 goto finally;
1936 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001938 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1939 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00001940 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001941 goto finally;
1942 }
1943 else {
1944 PyErr_Clear();
Guido van Rossum60456fd1997-04-09 17:36:32 +00001945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001946 if (!( state = PyObject_GetAttr(args, __dict___str))) {
1947 PyErr_Clear();
1948 res = 0;
1949 goto finally;
1950 }
1951 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001953 if (!PyDict_Check(state)) {
1954 if (put2(self, args) < 0)
1955 goto finally;
1956 }
1957 else {
1958 if (put(self, args) < 0)
1959 goto finally;
1960 }
Tim Peters84e87f32001-03-17 04:50:51 +00001961
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001962 if (save(self, state, 0) < 0)
1963 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001964
Tim Peters0bc93f52003-02-02 18:29:33 +00001965 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001966 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001967
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001968 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001969
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001970 finally:
1971 if (self->fast && !fast_save_leave(self, args))
1972 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001973
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001974 Py_XDECREF(module);
1975 Py_XDECREF(class);
1976 Py_XDECREF(state);
1977 Py_XDECREF(getinitargs_func);
1978 Py_XDECREF(getstate_func);
1979 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001981 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001982}
1983
1984
Guido van Rossum60456fd1997-04-09 17:36:32 +00001985static int
Tim Peterscba30e22003-02-01 06:24:36 +00001986save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001987{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001988 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001989 char *name_str, *module_str;
1990 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001991
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001992 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001993
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001994 if (name) {
1995 global_name = name;
1996 Py_INCREF(global_name);
1997 }
1998 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001999 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002000 goto finally;
2001 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002002
Tim Peterscba30e22003-02-01 06:24:36 +00002003 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002004 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002005
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002006 if ((module_size = PyString_Size(module)) < 0 ||
2007 (name_size = PyString_Size(global_name)) < 0)
2008 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002009
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002010 module_str = PyString_AS_STRING((PyStringObject *)module);
2011 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002012
Guido van Rossum75bfd052002-12-24 18:10:07 +00002013 /* XXX This can be doing a relative import. Clearly it shouldn't,
2014 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002015 mod = PyImport_ImportModule(module_str);
2016 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002017 cPickle_ErrFormat(PicklingError,
2018 "Can't pickle %s: it's not found as %s.%s",
2019 "OSS", args, module, global_name);
2020 goto finally;
2021 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002022 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002023 if (klass == NULL) {
2024 cPickle_ErrFormat(PicklingError,
2025 "Can't pickle %s: it's not found as %s.%s",
2026 "OSS", args, module, global_name);
2027 goto finally;
2028 }
2029 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002030 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002031 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00002032 "Can't pickle %s: it's not the same object "
2033 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002034 "OSS", args, module, global_name);
2035 goto finally;
2036 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00002037 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00002038
Tim Peters731098b2003-02-04 20:56:09 +00002039 if (self->proto >= 2) {
2040 /* See whether this is in the extension registry, and if
2041 * so generate an EXT opcode.
2042 */
2043 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00002044 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00002045 char c_str[5];
2046 int n;
2047
2048 PyTuple_SET_ITEM(two_tuple, 0, module);
2049 PyTuple_SET_ITEM(two_tuple, 1, global_name);
2050 py_code = PyDict_GetItem(extension_registry, two_tuple);
2051 if (py_code == NULL)
2052 goto gen_global; /* not registered */
2053
2054 /* Verify py_code has the right type and value. */
2055 if (!PyInt_Check(py_code)) {
2056 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00002057 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00002058 "OO", args, py_code);
2059 goto finally;
2060 }
2061 code = PyInt_AS_LONG(py_code);
2062 if (code <= 0 || code > 0x7fffffffL) {
2063 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
2064 "extension code %ld is out of range",
2065 "Ol", args, code);
2066 goto finally;
2067 }
2068
2069 /* Generate an EXT opcode. */
2070 if (code <= 0xff) {
2071 c_str[0] = EXT1;
2072 c_str[1] = (char)code;
2073 n = 2;
2074 }
2075 else if (code <= 0xffff) {
2076 c_str[0] = EXT2;
2077 c_str[1] = (char)(code & 0xff);
2078 c_str[2] = (char)((code >> 8) & 0xff);
2079 n = 3;
2080 }
2081 else {
2082 c_str[0] = EXT4;
2083 c_str[1] = (char)(code & 0xff);
2084 c_str[2] = (char)((code >> 8) & 0xff);
2085 c_str[3] = (char)((code >> 16) & 0xff);
2086 c_str[4] = (char)((code >> 24) & 0xff);
2087 n = 5;
2088 }
2089
2090 if (self->write_func(self, c_str, n) >= 0)
2091 res = 0;
2092 goto finally; /* and don't memoize */
2093 }
2094
2095 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00002096 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002097 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002098
Tim Peters0bc93f52003-02-02 18:29:33 +00002099 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002100 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002101
Tim Peters0bc93f52003-02-02 18:29:33 +00002102 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002103 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002104
Tim Peters0bc93f52003-02-02 18:29:33 +00002105 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002106 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002107
Tim Peters0bc93f52003-02-02 18:29:33 +00002108 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002109 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002111 if (put(self, args) < 0)
2112 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002114 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002116 finally:
2117 Py_XDECREF(module);
2118 Py_XDECREF(global_name);
2119 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002121 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002122}
2123
Guido van Rossum60456fd1997-04-09 17:36:32 +00002124static int
Tim Peterscba30e22003-02-01 06:24:36 +00002125save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002126{
2127 PyObject *pid = 0;
2128 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002129
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002130 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002132 Py_INCREF(args);
2133 ARG_TUP(self, args);
2134 if (self->arg) {
2135 pid = PyObject_Call(f, self->arg, NULL);
2136 FREE_ARG_TUP(self);
2137 }
2138 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002140 if (pid != Py_None) {
2141 if (!self->bin) {
2142 if (!PyString_Check(pid)) {
2143 PyErr_SetString(PicklingError,
2144 "persistent id must be string");
2145 goto finally;
2146 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002147
Tim Peters0bc93f52003-02-02 18:29:33 +00002148 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002149 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002150
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002151 if ((size = PyString_Size(pid)) < 0)
2152 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002153
Tim Peters0bc93f52003-02-02 18:29:33 +00002154 if (self->write_func(self,
2155 PyString_AS_STRING(
2156 (PyStringObject *)pid),
2157 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002158 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002159
Tim Peters0bc93f52003-02-02 18:29:33 +00002160 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002161 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002163 res = 1;
2164 goto finally;
2165 }
2166 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00002167 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002168 res = -1;
2169 else
2170 res = 1;
2171 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002173 goto finally;
2174 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002175
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002176 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002178 finally:
2179 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002180
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002181 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002182}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002183
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002184
Tim Peters84e87f32001-03-17 04:50:51 +00002185static int
Guido van Rossum60456fd1997-04-09 17:36:32 +00002186save_reduce(Picklerobject *self, PyObject *callable,
Tim Peterscba30e22003-02-01 06:24:36 +00002187 PyObject *tup, PyObject *state, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002188{
2189 static char reduce = REDUCE, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002190
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002191 if (save(self, callable, 0) < 0)
2192 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002194 if (save(self, tup, 0) < 0)
2195 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002196
Tim Peters0bc93f52003-02-02 18:29:33 +00002197 if (self->write_func(self, &reduce, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002198 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002200 if (ob != NULL) {
2201 if (state && !PyDict_Check(state)) {
2202 if (put2(self, ob) < 0)
2203 return -1;
2204 }
2205 else {
2206 if (put(self, ob) < 0)
2207 return -1;
2208 }
2209 }
Tim Peters84e87f32001-03-17 04:50:51 +00002210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002211 if (state) {
2212 if (save(self, state, 0) < 0)
2213 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002214
Tim Peters0bc93f52003-02-02 18:29:33 +00002215 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002216 return -1;
2217 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002218
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002219 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002220}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002221
Guido van Rossum60456fd1997-04-09 17:36:32 +00002222static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002223save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002224{
2225 PyTypeObject *type;
2226 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0, *arg_tup = 0,
2227 *callable = 0, *state = 0;
2228 int res = -1, tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002229
Martin v. Löwis5a395302002-08-04 08:20:23 +00002230 if (self->nesting++ > Py_GetRecursionLimit()){
2231 PyErr_SetString(PyExc_RuntimeError,
2232 "maximum recursion depth exceeded");
2233 goto finally;
2234 }
2235
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002236 if (!pers_save && self->pers_func) {
2237 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2238 res = tmp;
2239 goto finally;
2240 }
2241 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002243 if (args == Py_None) {
2244 res = save_none(self, args);
2245 goto finally;
2246 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002247
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002248 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002249
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002250 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002251 case 'b':
2252 if (args == Py_False || args == Py_True) {
2253 res = save_bool(self, args);
2254 goto finally;
2255 }
2256 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002257 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002258 if (type == &PyInt_Type) {
2259 res = save_int(self, args);
2260 goto finally;
2261 }
2262 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002263
Guido van Rossum60456fd1997-04-09 17:36:32 +00002264 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002265 if (type == &PyLong_Type) {
2266 res = save_long(self, args);
2267 goto finally;
2268 }
2269 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002270
Guido van Rossum60456fd1997-04-09 17:36:32 +00002271 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002272 if (type == &PyFloat_Type) {
2273 res = save_float(self, args);
2274 goto finally;
2275 }
2276 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002277
Guido van Rossum60456fd1997-04-09 17:36:32 +00002278 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002279 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2280 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002281 goto finally;
2282 }
2283 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002284
Guido van Rossum60456fd1997-04-09 17:36:32 +00002285 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002286 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2287 res = save_string(self, args, 0);
2288 goto finally;
2289 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002290
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002291#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002292 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002293 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2294 res = save_unicode(self, args, 0);
2295 goto finally;
2296 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002297#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002298 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002300 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002301 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002302 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002304 if (PyDict_GetItem(self->memo, py_ob_id)) {
2305 if (get(self, py_ob_id) < 0)
2306 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002307
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002308 res = 0;
2309 goto finally;
2310 }
2311 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002312
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002313 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002314 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002315 if (type == &PyString_Type) {
2316 res = save_string(self, args, 1);
2317 goto finally;
2318 }
2319 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002320
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002321#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002322 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002323 if (type == &PyUnicode_Type) {
2324 res = save_unicode(self, args, 1);
2325 goto finally;
2326 }
2327 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002328#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002329
Guido van Rossum60456fd1997-04-09 17:36:32 +00002330 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002331 if (type == &PyTuple_Type) {
2332 res = save_tuple(self, args);
2333 goto finally;
2334 }
2335 if (type == &PyType_Type) {
2336 res = save_global(self, args, NULL);
2337 goto finally;
2338 }
2339 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002340
Guido van Rossum60456fd1997-04-09 17:36:32 +00002341 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002342 if (type == &PyList_Type) {
2343 res = save_list(self, args);
2344 goto finally;
2345 }
2346 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002347
2348 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002349 if (type == &PyDict_Type) {
2350 res = save_dict(self, args);
2351 goto finally;
2352 }
2353 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002354
2355 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002356 if (type == &PyInstance_Type) {
2357 res = save_inst(self, args);
2358 goto finally;
2359 }
2360 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002361
2362 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002363 if (type == &PyClass_Type) {
2364 res = save_global(self, args, NULL);
2365 goto finally;
2366 }
2367 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002368
2369 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002370 if (type == &PyFunction_Type) {
2371 res = save_global(self, args, NULL);
2372 goto finally;
2373 }
2374 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002375
2376 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002377 if (type == &PyCFunction_Type) {
2378 res = save_global(self, args, NULL);
2379 goto finally;
2380 }
2381 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002383 if (!pers_save && self->inst_pers_func) {
2384 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2385 res = tmp;
2386 goto finally;
2387 }
2388 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002389
Jeremy Hylton39c61162002-07-16 19:47:43 +00002390 if (PyType_IsSubtype(type, &PyType_Type)) {
2391 res = save_global(self, args, NULL);
2392 goto finally;
2393 }
2394
Tim Peters5aa3da62003-02-13 21:03:57 +00002395 assert(t == NULL); /* just a reminder */
2396 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2397 if (__reduce__ != NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002398 Py_INCREF(__reduce__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002399 Py_INCREF(args);
2400 ARG_TUP(self, args);
2401 if (self->arg) {
2402 t = PyObject_Call(__reduce__, self->arg, NULL);
2403 FREE_ARG_TUP(self);
2404 }
2405 if (! t) goto finally;
2406 }
2407 else {
Tim Peters5aa3da62003-02-13 21:03:57 +00002408 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2409 if (__reduce__ == NULL)
2410 PyErr_Clear();
2411 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002412 t = PyObject_Call(__reduce__, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00002413 if (!t)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002414 goto finally;
2415 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002416 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002417
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002418 if (t) {
2419 if (PyString_Check(t)) {
2420 res = save_global(self, args, t);
2421 goto finally;
2422 }
Tim Peters84e87f32001-03-17 04:50:51 +00002423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002424 if (!PyTuple_Check(t)) {
Tim Peters5aa3da62003-02-13 21:03:57 +00002425 cPickle_ErrFormat(PicklingError, "Value returned by "
2426 "%s must be a tuple",
2427 "O", __reduce__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002428 goto finally;
2429 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002430
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002431 size = PyTuple_Size(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002432
Tim Peters5aa3da62003-02-13 21:03:57 +00002433 if (size != 3 && size != 2) {
2434 cPickle_ErrFormat(PicklingError, "tuple returned by "
2435 "%s must contain only two or three elements",
2436 "O", __reduce__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002437 goto finally;
2438 }
Tim Peters84e87f32001-03-17 04:50:51 +00002439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002440 callable = PyTuple_GET_ITEM(t, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002441 arg_tup = PyTuple_GET_ITEM(t, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002443 if (size > 2) {
2444 state = PyTuple_GET_ITEM(t, 2);
Guido van Rossum8e0ad0c2003-01-31 21:10:31 +00002445 if (state == Py_None)
2446 state = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002447 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002448
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002449 if (!( PyTuple_Check(arg_tup) || arg_tup==Py_None )) {
Tim Peters5aa3da62003-02-13 21:03:57 +00002450 cPickle_ErrFormat(PicklingError, "Second element of "
2451 "tuple returned by %s must be a tuple",
2452 "O", __reduce__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002453 goto finally;
2454 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002455
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002456 res = save_reduce(self, callable, arg_tup, state, args);
2457 goto finally;
2458 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002460 PyErr_SetObject(UnpickleableError, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002461
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002462 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002463 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002464 Py_XDECREF(py_ob_id);
2465 Py_XDECREF(__reduce__);
2466 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002467
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002468 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002469}
2470
2471
2472static int
Tim Peterscba30e22003-02-01 06:24:36 +00002473dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002474{
2475 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002476
Tim Peters4190fb82003-02-02 16:09:05 +00002477 if (self->proto >= 2) {
2478 char bytes[2];
2479
2480 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002481 assert(self->proto >= 0 && self->proto < 256);
2482 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002483 if (self->write_func(self, bytes, 2) < 0)
2484 return -1;
2485 }
2486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002487 if (save(self, args, 0) < 0)
2488 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002489
Tim Peters4190fb82003-02-02 16:09:05 +00002490 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002491 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002492
Tim Peters4190fb82003-02-02 16:09:05 +00002493 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002494 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002496 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002497}
2498
2499static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002500Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002501{
Tim Peterscba30e22003-02-01 06:24:36 +00002502 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002503 PyDict_Clear(self->memo);
2504 Py_INCREF(Py_None);
2505 return Py_None;
2506}
2507
2508static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002509Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002510{
2511 int l, i, rsize, ssize, clear=1, lm;
2512 long ik;
2513 PyObject *k, *r;
2514 char *s, *p, *have_get;
2515 Pdata *data;
2516
2517 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002518 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002519 return NULL;
2520
2521 /* Check to make sure we are based on a list */
2522 if (! Pdata_Check(self->file)) {
2523 PyErr_SetString(PicklingError,
2524 "Attempt to getvalue() a non-list-based pickler");
2525 return NULL;
2526 }
2527
2528 /* flush write buffer */
2529 if (write_other(self, NULL, 0) < 0) return NULL;
2530
2531 data=(Pdata*)self->file;
2532 l=data->length;
2533
2534 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002535 lm = PyDict_Size(self->memo);
2536 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002537 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002538 have_get = malloc(lm);
2539 if (have_get == NULL) return PyErr_NoMemory();
2540 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002541
2542 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002543 for (rsize = 0, i = l; --i >= 0; ) {
2544 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002545
Tim Petersac5687a2003-02-02 18:08:34 +00002546 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002547 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002548
2549 else if (PyInt_Check(k)) { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002550 ik = PyInt_AS_LONG((PyIntObject*)k);
2551 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002552 PyErr_SetString(PicklingError,
2553 "Invalid get data");
2554 return NULL;
2555 }
Tim Petersac5687a2003-02-02 18:08:34 +00002556 if (have_get[ik]) /* with matching get */
2557 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002558 }
2559
2560 else if (! (PyTuple_Check(k) &&
2561 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002562 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002563 ) {
2564 PyErr_SetString(PicklingError,
2565 "Unexpected data in internal list");
2566 return NULL;
2567 }
2568
2569 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002570 ik = PyInt_AS_LONG((PyIntObject *)k);
2571 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002572 PyErr_SetString(PicklingError,
2573 "Invalid get data");
2574 return NULL;
2575 }
Tim Petersac5687a2003-02-02 18:08:34 +00002576 have_get[ik] = 1;
2577 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002578 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002579 }
2580
2581 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002582 r = PyString_FromStringAndSize(NULL, rsize);
2583 if (r == NULL) goto err;
2584 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002585
Tim Petersac5687a2003-02-02 18:08:34 +00002586 for (i = 0; i < l; i++) {
2587 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002588
2589 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002590 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002591 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002592 p=PyString_AS_STRING((PyStringObject *)k);
2593 while (--ssize >= 0)
2594 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002595 }
2596 }
2597
2598 else if (PyTuple_Check(k)) { /* get */
Tim Petersac5687a2003-02-02 18:08:34 +00002599 ik = PyInt_AS_LONG((PyIntObject *)
2600 PyTuple_GET_ITEM(k, 0));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002601 if (ik < 256) {
2602 *s++ = BINGET;
2603 *s++ = (int)(ik & 0xff);
2604 }
2605 else {
2606 *s++ = LONG_BINGET;
2607 *s++ = (int)(ik & 0xff);
2608 *s++ = (int)((ik >> 8) & 0xff);
2609 *s++ = (int)((ik >> 16) & 0xff);
2610 *s++ = (int)((ik >> 24) & 0xff);
2611 }
2612 }
2613
2614 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002615 ik = PyInt_AS_LONG((PyIntObject*)k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002616
2617 if (have_get[ik]) { /* with matching get */
2618 if (ik < 256) {
2619 *s++ = BINPUT;
2620 *s++ = (int)(ik & 0xff);
2621 }
2622 else {
2623 *s++ = LONG_BINPUT;
2624 *s++ = (int)(ik & 0xff);
2625 *s++ = (int)((ik >> 8) & 0xff);
2626 *s++ = (int)((ik >> 16) & 0xff);
2627 *s++ = (int)((ik >> 24) & 0xff);
2628 }
2629 }
2630 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002631 }
2632
2633 if (clear) {
2634 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002635 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002636 }
2637
2638 free(have_get);
2639 return r;
2640 err:
2641 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002642 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002643}
2644
2645static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002646Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002647{
2648 PyObject *ob;
2649 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002650
Tim Peterscba30e22003-02-01 06:24:36 +00002651 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002652 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002654 if (dump(self, ob) < 0)
2655 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002657 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002658
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002659 /* XXX Why does dump() return self? */
2660 Py_INCREF(self);
2661 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002662}
2663
2664
Tim Peterscba30e22003-02-01 06:24:36 +00002665static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002666{
Neal Norwitzb0493252002-03-31 14:44:22 +00002667 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002668 PyDoc_STR("dump(object) -- "
2669 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002670 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002671 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002672 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002673 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002674 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002675};
2676
2677
2678static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002679newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002680{
2681 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002682
Tim Peters5bd2a792003-02-01 16:45:06 +00002683 if (proto < 0)
Tim Peters8587b3c2003-02-13 15:44:41 +00002684 proto = HIGHEST_PROTOCOL;
2685 if (proto > HIGHEST_PROTOCOL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002686 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2687 "the highest available protocol is %d",
Tim Peters8587b3c2003-02-13 15:44:41 +00002688 proto, HIGHEST_PROTOCOL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002689 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002690 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002691
Tim Peters5bd2a792003-02-01 16:45:06 +00002692 self = PyObject_New(Picklerobject, &Picklertype);
2693 if (self == NULL)
2694 return NULL;
2695 self->proto = proto;
2696 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002697 self->fp = NULL;
2698 self->write = NULL;
2699 self->memo = NULL;
2700 self->arg = NULL;
2701 self->pers_func = NULL;
2702 self->inst_pers_func = NULL;
2703 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002704 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002705 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002706 self->fast_container = 0;
2707 self->fast_memo = NULL;
2708 self->buf_size = 0;
2709 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002710
Tim Peters5bd2a792003-02-01 16:45:06 +00002711 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002712 if (file)
2713 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002714 else {
2715 file = Pdata_New();
2716 if (file == NULL)
2717 goto err;
2718 }
2719 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002720
Tim Peterscba30e22003-02-01 06:24:36 +00002721 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002722 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002724 if (PyFile_Check(file)) {
2725 self->fp = PyFile_AsFile(file);
2726 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002727 PyErr_SetString(PyExc_ValueError,
2728 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002729 goto err;
2730 }
2731 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002732 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002733 else if (PycStringIO_OutputCheck(file)) {
2734 self->write_func = write_cStringIO;
2735 }
2736 else if (file == Py_None) {
2737 self->write_func = write_none;
2738 }
2739 else {
2740 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002741
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002742 if (! Pdata_Check(file)) {
2743 self->write = PyObject_GetAttr(file, write_str);
2744 if (!self->write) {
2745 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002746 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002747 "argument must have 'write' "
2748 "attribute");
2749 goto err;
2750 }
2751 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002752
Tim Peters5bd2a792003-02-01 16:45:06 +00002753 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2754 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002755 PyErr_NoMemory();
2756 goto err;
2757 }
2758 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002760 if (PyEval_GetRestricted()) {
2761 /* Restricted execution, get private tables */
Tim Peters5b7da392003-02-04 00:21:07 +00002762 PyObject *m = PyImport_Import(copy_reg_str);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002763
Tim Peters5b7da392003-02-04 00:21:07 +00002764 if (m == NULL)
2765 goto err;
2766 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002767 Py_DECREF(m);
Tim Peters5b7da392003-02-04 00:21:07 +00002768 if (self->dispatch_table == NULL)
2769 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002770 }
2771 else {
Tim Peters5b7da392003-02-04 00:21:07 +00002772 self->dispatch_table = dispatch_table;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002773 Py_INCREF(dispatch_table);
2774 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002776 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002778 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002779 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002780 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002781}
2782
2783
2784static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002785get_Pickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002786{
2787 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002788 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002789
Tim Peters92c8bb32003-02-13 23:00:26 +00002790 /* XXX
2791 * The documented signature is Pickler(file, proto=0), but this
2792 * accepts Pickler() and Pickler(integer) too. The meaning then
2793 * is clear as mud, undocumented, and not supported by pickle.py.
2794 * I'm told Zope uses this, but I haven't traced into this code
2795 * far enough to figure out what it means.
Tim Peters5bd2a792003-02-01 16:45:06 +00002796 */
2797 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002798 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002799 proto = 0;
2800 if (!PyArg_ParseTuple(args, "O|i:Pickler", &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002801 return NULL;
2802 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002803 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002804}
2805
2806
2807static void
Tim Peterscba30e22003-02-01 06:24:36 +00002808Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002809{
2810 Py_XDECREF(self->write);
2811 Py_XDECREF(self->memo);
2812 Py_XDECREF(self->fast_memo);
2813 Py_XDECREF(self->arg);
2814 Py_XDECREF(self->file);
2815 Py_XDECREF(self->pers_func);
2816 Py_XDECREF(self->inst_pers_func);
2817 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002818 PyMem_Free(self->write_buf);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002819 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002820}
2821
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002822static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002823Pickler_get_pers_func(Picklerobject *p)
2824{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002825 if (p->pers_func == NULL)
2826 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2827 else
2828 Py_INCREF(p->pers_func);
2829 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002830}
2831
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002832static int
2833Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2834{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002835 if (v == NULL) {
2836 PyErr_SetString(PyExc_TypeError,
2837 "attribute deletion is not supported");
2838 return -1;
2839 }
2840 Py_XDECREF(p->pers_func);
2841 Py_INCREF(v);
2842 p->pers_func = v;
2843 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002844}
2845
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002846static int
2847Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2848{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002849 if (v == NULL) {
2850 PyErr_SetString(PyExc_TypeError,
2851 "attribute deletion is not supported");
2852 return -1;
2853 }
2854 Py_XDECREF(p->inst_pers_func);
2855 Py_INCREF(v);
2856 p->inst_pers_func = v;
2857 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002858}
2859
2860static PyObject *
2861Pickler_get_memo(Picklerobject *p)
2862{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002863 if (p->memo == NULL)
2864 PyErr_SetString(PyExc_AttributeError, "memo");
2865 else
2866 Py_INCREF(p->memo);
2867 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002868}
2869
2870static int
2871Pickler_set_memo(Picklerobject *p, PyObject *v)
2872{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002873 if (v == NULL) {
2874 PyErr_SetString(PyExc_TypeError,
2875 "attribute deletion is not supported");
2876 return -1;
2877 }
2878 if (!PyDict_Check(v)) {
2879 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2880 return -1;
2881 }
2882 Py_XDECREF(p->memo);
2883 Py_INCREF(v);
2884 p->memo = v;
2885 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002886}
2887
2888static PyObject *
2889Pickler_get_error(Picklerobject *p)
2890{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002891 /* why is this an attribute on the Pickler? */
2892 Py_INCREF(PicklingError);
2893 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002894}
2895
2896static PyMemberDef Pickler_members[] = {
2897 {"binary", T_INT, offsetof(Picklerobject, bin)},
2898 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002899 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002900};
2901
2902static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002903 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002904 (setter)Pickler_set_pers_func},
2905 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2906 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002907 {"PicklingError", (getter)Pickler_get_error, NULL},
2908 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002909};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002910
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002911PyDoc_STRVAR(Picklertype__doc__,
2912"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002913
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002914static PyTypeObject Picklertype = {
2915 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002916 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002917 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002918 sizeof(Picklerobject), /*tp_basicsize*/
2919 0,
2920 (destructor)Pickler_dealloc, /* tp_dealloc */
2921 0, /* tp_print */
2922 0, /* tp_getattr */
2923 0, /* tp_setattr */
2924 0, /* tp_compare */
2925 0, /* tp_repr */
2926 0, /* tp_as_number */
2927 0, /* tp_as_sequence */
2928 0, /* tp_as_mapping */
2929 0, /* tp_hash */
2930 0, /* tp_call */
2931 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002932 PyObject_GenericGetAttr, /* tp_getattro */
2933 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002934 0, /* tp_as_buffer */
2935 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2936 Picklertype__doc__, /* tp_doc */
2937 0, /* tp_traverse */
2938 0, /* tp_clear */
2939 0, /* tp_richcompare */
2940 0, /* tp_weaklistoffset */
2941 0, /* tp_iter */
2942 0, /* tp_iternext */
2943 Pickler_methods, /* tp_methods */
2944 Pickler_members, /* tp_members */
2945 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002946};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002947
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002948static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002949find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002950{
2951 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002953 if (fc) {
2954 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00002955 PyErr_SetString(UnpicklingError, "Global and instance "
2956 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002957 return NULL;
2958 }
Tim Peterscba30e22003-02-01 06:24:36 +00002959 return PyObject_CallFunction(fc, "OO", py_module_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002960 py_global_name);
2961 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002963 module = PySys_GetObject("modules");
2964 if (module == NULL)
2965 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002967 module = PyDict_GetItem(module, py_module_name);
2968 if (module == NULL) {
2969 module = PyImport_Import(py_module_name);
2970 if (!module)
2971 return NULL;
2972 global = PyObject_GetAttr(module, py_global_name);
2973 Py_DECREF(module);
2974 }
2975 else
2976 global = PyObject_GetAttr(module, py_global_name);
2977 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002978}
2979
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002980static int
Tim Peterscba30e22003-02-01 06:24:36 +00002981marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002982{
2983 if (self->num_marks < 1) {
2984 PyErr_SetString(UnpicklingError, "could not find MARK");
2985 return -1;
2986 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002987
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002988 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002989}
2990
Tim Peters84e87f32001-03-17 04:50:51 +00002991
Guido van Rossum60456fd1997-04-09 17:36:32 +00002992static int
Tim Peterscba30e22003-02-01 06:24:36 +00002993load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002994{
2995 PDATA_APPEND(self->stack, Py_None, -1);
2996 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002997}
2998
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002999static int
Tim Peterscba30e22003-02-01 06:24:36 +00003000bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003001{
3002 PyErr_SetString(UnpicklingError, "pickle data was truncated");
3003 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003004}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003005
3006static int
Tim Peterscba30e22003-02-01 06:24:36 +00003007load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003008{
3009 PyObject *py_int = 0;
3010 char *endptr, *s;
3011 int len, res = -1;
3012 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003013
Tim Peters0bc93f52003-02-02 18:29:33 +00003014 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003015 if (len < 2) return bad_readline();
3016 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003017
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003018 errno = 0;
3019 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003021 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
3022 /* Hm, maybe we've got something long. Let's try reading
3023 it as a Python long object. */
3024 errno = 0;
3025 py_int = PyLong_FromString(s, NULL, 0);
3026 if (py_int == NULL) {
3027 PyErr_SetString(PyExc_ValueError,
3028 "could not convert string to int");
3029 goto finally;
3030 }
3031 }
3032 else {
Guido van Rossume2763392002-04-05 19:30:08 +00003033 if (len == 3 && (l == 0 || l == 1)) {
3034 if (!( py_int = PyBool_FromLong(l))) goto finally;
3035 }
3036 else {
3037 if (!( py_int = PyInt_FromLong(l))) goto finally;
3038 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003039 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003040
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003041 free(s);
3042 PDATA_PUSH(self->stack, py_int, -1);
3043 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003045 finally:
3046 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003047
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003048 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003049}
3050
Tim Peters3c67d792003-02-02 17:59:11 +00003051static int
3052load_bool(Unpicklerobject *self, PyObject *boolean)
3053{
3054 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00003055 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00003056 return 0;
3057}
3058
Tim Petersee1a53c2003-02-02 02:57:53 +00003059/* s contains x bytes of a little-endian integer. Return its value as a
3060 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3061 * int, but when x is 4 it's a signed one. This is an historical source
3062 * of x-platform bugs.
3063 */
Tim Peters84e87f32001-03-17 04:50:51 +00003064static long
Tim Petersee1a53c2003-02-02 02:57:53 +00003065calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003066{
3067 unsigned char c;
3068 int i;
3069 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003070
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003071 for (i = 0, l = 0L; i < x; i++) {
3072 c = (unsigned char)s[i];
3073 l |= (long)c << (i * 8);
3074 }
Tim Petersbfa18f72001-04-10 01:54:42 +00003075#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003076 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3077 * is signed, so on a box with longs bigger than 4 bytes we need
3078 * to extend a BININT's sign bit to the full width.
3079 */
3080 if (x == 4 && l & (1L << 31))
3081 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00003082#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003083 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003084}
3085
3086
3087static int
Tim Peterscba30e22003-02-01 06:24:36 +00003088load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003089{
3090 PyObject *py_int = 0;
3091 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003092
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003093 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003094
Tim Peterscba30e22003-02-01 06:24:36 +00003095 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003096 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003097
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003098 PDATA_PUSH(self->stack, py_int, -1);
3099 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003100}
3101
3102
3103static int
Tim Peterscba30e22003-02-01 06:24:36 +00003104load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003105{
3106 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003107
Tim Peters0bc93f52003-02-02 18:29:33 +00003108 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003109 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003111 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003112}
3113
3114
3115static int
Tim Peterscba30e22003-02-01 06:24:36 +00003116load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003117{
3118 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003119
Tim Peters0bc93f52003-02-02 18:29:33 +00003120 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003121 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003123 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003124}
3125
3126
3127static int
Tim Peterscba30e22003-02-01 06:24:36 +00003128load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003129{
3130 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003131
Tim Peters0bc93f52003-02-02 18:29:33 +00003132 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003133 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003135 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003136}
Tim Peters84e87f32001-03-17 04:50:51 +00003137
Guido van Rossum60456fd1997-04-09 17:36:32 +00003138static int
Tim Peterscba30e22003-02-01 06:24:36 +00003139load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003140{
3141 PyObject *l = 0;
3142 char *end, *s;
3143 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003144
Tim Peters0bc93f52003-02-02 18:29:33 +00003145 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003146 if (len < 2) return bad_readline();
3147 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003148
Tim Peterscba30e22003-02-01 06:24:36 +00003149 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003150 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003152 free(s);
3153 PDATA_PUSH(self->stack, l, -1);
3154 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003155
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003156 finally:
3157 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003159 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003160}
3161
Tim Petersee1a53c2003-02-02 02:57:53 +00003162/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3163 * data following.
3164 */
3165static int
3166load_counted_long(Unpicklerobject *self, int size)
3167{
3168 int i;
3169 char *nbytes;
3170 unsigned char *pdata;
3171 PyObject *along;
3172
3173 assert(size == 1 || size == 4);
3174 i = self->read_func(self, &nbytes, size);
3175 if (i < 0) return -1;
3176
3177 size = calc_binint(nbytes, size);
3178 if (size < 0) {
3179 /* Corrupt or hostile pickle -- we never write one like
3180 * this.
3181 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003182 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003183 "byte count");
3184 return -1;
3185 }
3186
3187 if (size == 0)
3188 along = PyLong_FromLong(0L);
3189 else {
3190 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003191 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003192 if (i < 0) return -1;
3193 along = _PyLong_FromByteArray(pdata, (size_t)size,
3194 1 /* little endian */, 1 /* signed */);
3195 }
3196 if (along == NULL)
3197 return -1;
3198 PDATA_PUSH(self->stack, along, -1);
3199 return 0;
3200}
Tim Peters84e87f32001-03-17 04:50:51 +00003201
Guido van Rossum60456fd1997-04-09 17:36:32 +00003202static int
Tim Peterscba30e22003-02-01 06:24:36 +00003203load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003204{
3205 PyObject *py_float = 0;
3206 char *endptr, *s;
3207 int len, res = -1;
3208 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003209
Tim Peters0bc93f52003-02-02 18:29:33 +00003210 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003211 if (len < 2) return bad_readline();
3212 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003214 errno = 0;
3215 d = strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003217 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3218 PyErr_SetString(PyExc_ValueError,
3219 "could not convert string to float");
3220 goto finally;
3221 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003222
Tim Peterscba30e22003-02-01 06:24:36 +00003223 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003224 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003226 free(s);
3227 PDATA_PUSH(self->stack, py_float, -1);
3228 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003229
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003230 finally:
3231 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003232
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003233 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003234}
3235
Guido van Rossum60456fd1997-04-09 17:36:32 +00003236static int
Tim Peterscba30e22003-02-01 06:24:36 +00003237load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003238{
3239 PyObject *py_float = 0;
3240 int s, e;
3241 long fhi, flo;
3242 double x;
3243 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003244
Tim Peters0bc93f52003-02-02 18:29:33 +00003245 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003246 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003247
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003248 /* First byte */
3249 s = (*p>>7) & 1;
3250 e = (*p & 0x7F) << 4;
3251 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003252
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003253 /* Second byte */
3254 e |= (*p>>4) & 0xF;
3255 fhi = (*p & 0xF) << 24;
3256 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003257
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003258 /* Third byte */
3259 fhi |= (*p & 0xFF) << 16;
3260 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003261
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003262 /* Fourth byte */
3263 fhi |= (*p & 0xFF) << 8;
3264 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003265
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003266 /* Fifth byte */
3267 fhi |= *p & 0xFF;
3268 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003269
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003270 /* Sixth byte */
3271 flo = (*p & 0xFF) << 16;
3272 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003273
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003274 /* Seventh byte */
3275 flo |= (*p & 0xFF) << 8;
3276 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003278 /* Eighth byte */
3279 flo |= *p & 0xFF;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003281 x = (double)fhi + (double)flo / 16777216.0; /* 2**24 */
3282 x /= 268435456.0; /* 2**28 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00003283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003284 /* XXX This sadly ignores Inf/NaN */
3285 if (e == 0)
3286 e = -1022;
3287 else {
3288 x += 1.0;
3289 e -= 1023;
3290 }
3291 x = ldexp(x, e);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003292
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003293 if (s)
3294 x = -x;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003295
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003296 if (!( py_float = PyFloat_FromDouble(x))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003297
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003298 PDATA_PUSH(self->stack, py_float, -1);
3299 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003300}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003301
3302static int
Tim Peterscba30e22003-02-01 06:24:36 +00003303load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003304{
3305 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003306 int len, res = -1;
3307 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003308
Tim Peters0bc93f52003-02-02 18:29:33 +00003309 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003310 if (len < 2) return bad_readline();
3311 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003312
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003313
3314 /* Strip outermost quotes */
3315 while (s[len-1] <= ' ')
3316 len--;
3317 if(s[0]=='"' && s[len-1]=='"'){
3318 s[len-1] = '\0';
3319 p = s + 1 ;
3320 len -= 2;
3321 } else if(s[0]=='\'' && s[len-1]=='\''){
3322 s[len-1] = '\0';
3323 p = s + 1 ;
3324 len -= 2;
3325 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003326 goto insecure;
3327 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003328
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003329 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
3330 if (str) {
3331 PDATA_PUSH(self->stack, str, -1);
3332 res = 0;
3333 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003334 free(s);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003335 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003336
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003337 insecure:
3338 free(s);
3339 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3340 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003341}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003342
3343
3344static int
Tim Peterscba30e22003-02-01 06:24:36 +00003345load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003346{
3347 PyObject *py_string = 0;
3348 long l;
3349 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003350
Tim Peters0bc93f52003-02-02 18:29:33 +00003351 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003353 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003354
Tim Peters0bc93f52003-02-02 18:29:33 +00003355 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003356 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003357
Tim Peterscba30e22003-02-01 06:24:36 +00003358 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003359 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003361 PDATA_PUSH(self->stack, py_string, -1);
3362 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003363}
3364
3365
3366static int
Tim Peterscba30e22003-02-01 06:24:36 +00003367load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003368{
3369 PyObject *py_string = 0;
3370 unsigned char l;
3371 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003372
Tim Peters0bc93f52003-02-02 18:29:33 +00003373 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003374 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003375
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003376 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003377
Tim Peters0bc93f52003-02-02 18:29:33 +00003378 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003379
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003380 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003382 PDATA_PUSH(self->stack, py_string, -1);
3383 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003384}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003385
3386
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003387#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003388static int
Tim Peterscba30e22003-02-01 06:24:36 +00003389load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003390{
3391 PyObject *str = 0;
3392 int len, res = -1;
3393 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003394
Tim Peters0bc93f52003-02-02 18:29:33 +00003395 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003396 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003397
Tim Peterscba30e22003-02-01 06:24:36 +00003398 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003399 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003401 PDATA_PUSH(self->stack, str, -1);
3402 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003403
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003404 finally:
3405 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003406}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003407#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003408
3409
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003410#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003411static int
Tim Peterscba30e22003-02-01 06:24:36 +00003412load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003413{
3414 PyObject *unicode;
3415 long l;
3416 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003417
Tim Peters0bc93f52003-02-02 18:29:33 +00003418 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003420 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003421
Tim Peters0bc93f52003-02-02 18:29:33 +00003422 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003423 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003424
Tim Peterscba30e22003-02-01 06:24:36 +00003425 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003426 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003427
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003428 PDATA_PUSH(self->stack, unicode, -1);
3429 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003430}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003431#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003432
3433
3434static int
Tim Peterscba30e22003-02-01 06:24:36 +00003435load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003436{
3437 PyObject *tup;
3438 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003440 if ((i = marker(self)) < 0) return -1;
3441 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3442 PDATA_PUSH(self->stack, tup, -1);
3443 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003444}
3445
3446static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003447load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003448{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003449 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003450
Tim Peters1d63c9f2003-02-02 20:29:39 +00003451 if (tup == NULL)
3452 return -1;
3453
3454 while (--len >= 0) {
3455 PyObject *element;
3456
3457 PDATA_POP(self->stack, element);
3458 if (element == NULL)
3459 return -1;
3460 PyTuple_SET_ITEM(tup, len, element);
3461 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003462 PDATA_PUSH(self->stack, tup, -1);
3463 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003464}
3465
3466static int
Tim Peterscba30e22003-02-01 06:24:36 +00003467load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003468{
3469 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003470
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003471 if (!( list=PyList_New(0))) return -1;
3472 PDATA_PUSH(self->stack, list, -1);
3473 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003474}
3475
3476static int
Tim Peterscba30e22003-02-01 06:24:36 +00003477load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003478{
3479 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003480
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003481 if (!( dict=PyDict_New())) return -1;
3482 PDATA_PUSH(self->stack, dict, -1);
3483 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003484}
3485
3486
3487static int
Tim Peterscba30e22003-02-01 06:24:36 +00003488load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003489{
3490 PyObject *list = 0;
3491 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003493 if ((i = marker(self)) < 0) return -1;
3494 if (!( list=Pdata_popList(self->stack, i))) return -1;
3495 PDATA_PUSH(self->stack, list, -1);
3496 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003497}
3498
3499static int
Tim Peterscba30e22003-02-01 06:24:36 +00003500load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003501{
3502 PyObject *dict, *key, *value;
3503 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003505 if ((i = marker(self)) < 0) return -1;
3506 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003508 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003510 for (k = i+1; k < j; k += 2) {
3511 key =self->stack->data[k-1];
3512 value=self->stack->data[k ];
3513 if (PyDict_SetItem(dict, key, value) < 0) {
3514 Py_DECREF(dict);
3515 return -1;
3516 }
3517 }
3518 Pdata_clear(self->stack, i);
3519 PDATA_PUSH(self->stack, dict, -1);
3520 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003521}
3522
3523static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003524Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003525{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003526 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003527
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003528 if (PyClass_Check(cls)) {
3529 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003530
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003531 if ((l=PyObject_Size(args)) < 0) goto err;
3532 if (!( l )) {
3533 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003534
Tim Peterscba30e22003-02-01 06:24:36 +00003535 __getinitargs__ = PyObject_GetAttr(cls,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003536 __getinitargs___str);
3537 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003538 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003539 so bypass usual construction */
3540 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003542 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003543 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003544 goto err;
3545 return inst;
3546 }
3547 Py_DECREF(__getinitargs__);
3548 }
Tim Peters84e87f32001-03-17 04:50:51 +00003549
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003550 if ((r=PyInstance_New(cls, args, NULL))) return r;
3551 else goto err;
3552 }
Tim Peters84e87f32001-03-17 04:50:51 +00003553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003554 if (args==Py_None) {
3555 /* Special case, call cls.__basicnew__() */
3556 PyObject *basicnew;
Tim Peters84e87f32001-03-17 04:50:51 +00003557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003558 basicnew = PyObject_GetAttr(cls, __basicnew___str);
3559 if (!basicnew) return NULL;
3560 r=PyObject_CallObject(basicnew, NULL);
3561 Py_DECREF(basicnew);
3562 if (r) return r;
3563 }
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003564
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003565 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003567 err:
3568 {
3569 PyObject *tp, *v, *tb;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003571 PyErr_Fetch(&tp, &v, &tb);
3572 if ((r=Py_BuildValue("OOO",v,cls,args))) {
3573 Py_XDECREF(v);
3574 v=r;
3575 }
3576 PyErr_Restore(tp,v,tb);
3577 }
3578 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003579}
Tim Peters84e87f32001-03-17 04:50:51 +00003580
Guido van Rossum60456fd1997-04-09 17:36:32 +00003581
3582static int
Tim Peterscba30e22003-02-01 06:24:36 +00003583load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003584{
3585 PyObject *class, *tup, *obj=0;
3586 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003588 if ((i = marker(self)) < 0) return -1;
3589 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3590 PDATA_POP(self->stack, class);
3591 if (class) {
3592 obj = Instance_New(class, tup);
3593 Py_DECREF(class);
3594 }
3595 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003596
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003597 if (! obj) return -1;
3598 PDATA_PUSH(self->stack, obj, -1);
3599 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003600}
3601
3602
3603static int
Tim Peterscba30e22003-02-01 06:24:36 +00003604load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003605{
3606 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3607 int i, len;
3608 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003610 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003611
Tim Peters0bc93f52003-02-02 18:29:33 +00003612 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003613 if (len < 2) return bad_readline();
3614 module_name = PyString_FromStringAndSize(s, len - 1);
3615 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003616
Tim Peters0bc93f52003-02-02 18:29:33 +00003617 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003618 if (len < 2) return bad_readline();
3619 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003620 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003621 self->find_class);
3622 Py_DECREF(class_name);
3623 }
3624 }
3625 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003627 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003628
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003629 if ((tup=Pdata_popTuple(self->stack, i))) {
3630 obj = Instance_New(class, tup);
3631 Py_DECREF(tup);
3632 }
3633 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003634
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003635 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003637 PDATA_PUSH(self->stack, obj, -1);
3638 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003639}
3640
Tim Peterseab7db32003-02-13 18:24:14 +00003641static int
3642load_newobj(Unpicklerobject *self)
3643{
3644 PyObject *args = NULL;
3645 PyObject *clsraw = NULL;
3646 PyTypeObject *cls; /* clsraw cast to its true type */
3647 PyObject *obj;
3648
3649 /* Stack is ... cls argtuple, and we want to call
3650 * cls.__new__(cls, *argtuple).
3651 */
3652 PDATA_POP(self->stack, args);
3653 if (args == NULL) goto Fail;
3654 if (! PyTuple_Check(args)) {
3655 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3656 "tuple.");
3657 goto Fail;
3658 }
3659
3660 PDATA_POP(self->stack, clsraw);
3661 cls = (PyTypeObject *)clsraw;
3662 if (cls == NULL) goto Fail;
3663 if (! PyType_Check(cls)) {
3664 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3665 "isn't a type object");
3666 goto Fail;
3667 }
3668 if (cls->tp_new == NULL) {
3669 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3670 "has NULL tp_new");
3671 goto Fail;
3672 }
3673
3674 /* Call __new__. */
3675 obj = cls->tp_new(cls, args, NULL);
3676 if (obj == NULL) goto Fail;
3677
3678 Py_DECREF(args);
3679 Py_DECREF(clsraw);
3680 PDATA_PUSH(self->stack, obj, -1);
3681 return 0;
3682
3683 Fail:
3684 Py_XDECREF(args);
3685 Py_XDECREF(clsraw);
3686 return -1;
3687}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003688
3689static int
Tim Peterscba30e22003-02-01 06:24:36 +00003690load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003691{
3692 PyObject *class = 0, *module_name = 0, *class_name = 0;
3693 int len;
3694 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003695
Tim Peters0bc93f52003-02-02 18:29:33 +00003696 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003697 if (len < 2) return bad_readline();
3698 module_name = PyString_FromStringAndSize(s, len - 1);
3699 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003700
Tim Peters0bc93f52003-02-02 18:29:33 +00003701 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003702 if (len < 2) {
3703 Py_DECREF(module_name);
3704 return bad_readline();
3705 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003706 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003707 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003708 self->find_class);
3709 Py_DECREF(class_name);
3710 }
3711 }
3712 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003714 if (! class) return -1;
3715 PDATA_PUSH(self->stack, class, -1);
3716 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003717}
3718
3719
3720static int
Tim Peterscba30e22003-02-01 06:24:36 +00003721load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003722{
3723 PyObject *pid = 0;
3724 int len;
3725 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003727 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003728 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003729 if (len < 2) return bad_readline();
3730
3731 pid = PyString_FromStringAndSize(s, len - 1);
3732 if (!pid) return -1;
3733
3734 if (PyList_Check(self->pers_func)) {
3735 if (PyList_Append(self->pers_func, pid) < 0) {
3736 Py_DECREF(pid);
3737 return -1;
3738 }
3739 }
3740 else {
3741 ARG_TUP(self, pid);
3742 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003743 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003744 NULL);
3745 FREE_ARG_TUP(self);
3746 }
3747 }
3748
3749 if (! pid) return -1;
3750
3751 PDATA_PUSH(self->stack, pid, -1);
3752 return 0;
3753 }
3754 else {
3755 PyErr_SetString(UnpicklingError,
3756 "A load persistent id instruction was encountered,\n"
3757 "but no persistent_load function was specified.");
3758 return -1;
3759 }
3760}
3761
3762static int
Tim Peterscba30e22003-02-01 06:24:36 +00003763load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003764{
3765 PyObject *pid = 0;
3766
3767 if (self->pers_func) {
3768 PDATA_POP(self->stack, pid);
3769 if (! pid) return -1;
3770
3771 if (PyList_Check(self->pers_func)) {
3772 if (PyList_Append(self->pers_func, pid) < 0) {
3773 Py_DECREF(pid);
3774 return -1;
3775 }
3776 }
3777 else {
3778 ARG_TUP(self, pid);
3779 if (self->arg) {
3780 pid = PyObject_Call(self->pers_func, self->arg,
3781 NULL);
3782 FREE_ARG_TUP(self);
3783 }
3784 if (! pid) return -1;
3785 }
3786
3787 PDATA_PUSH(self->stack, pid, -1);
3788 return 0;
3789 }
3790 else {
3791 PyErr_SetString(UnpicklingError,
3792 "A load persistent id instruction was encountered,\n"
3793 "but no persistent_load function was specified.");
3794 return -1;
3795 }
3796}
3797
3798
3799static int
Tim Peterscba30e22003-02-01 06:24:36 +00003800load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003801{
3802 int len;
3803
3804 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3805
3806 /* Note that we split the (pickle.py) stack into two stacks,
3807 an object stack and a mark stack. We have to be clever and
3808 pop the right one. We do this by looking at the top of the
3809 mark stack.
3810 */
3811
3812 if ((self->num_marks > 0) &&
3813 (self->marks[self->num_marks - 1] == len))
3814 self->num_marks--;
3815 else {
3816 len--;
3817 Py_DECREF(self->stack->data[len]);
3818 self->stack->length=len;
3819 }
3820
3821 return 0;
3822}
3823
3824
3825static int
Tim Peterscba30e22003-02-01 06:24:36 +00003826load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003827{
3828 int i;
3829
3830 if ((i = marker(self)) < 0)
3831 return -1;
3832
3833 Pdata_clear(self->stack, i);
3834
3835 return 0;
3836}
3837
3838
3839static int
Tim Peterscba30e22003-02-01 06:24:36 +00003840load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003841{
3842 PyObject *last;
3843 int len;
3844
3845 if ((len = self->stack->length) <= 0) return stackUnderflow();
3846 last=self->stack->data[len-1];
3847 Py_INCREF(last);
3848 PDATA_PUSH(self->stack, last, -1);
3849 return 0;
3850}
3851
3852
3853static int
Tim Peterscba30e22003-02-01 06:24:36 +00003854load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003855{
3856 PyObject *py_str = 0, *value = 0;
3857 int len;
3858 char *s;
3859 int rc;
3860
Tim Peters0bc93f52003-02-02 18:29:33 +00003861 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003862 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003864 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003866 value = PyDict_GetItem(self->memo, py_str);
3867 if (! value) {
3868 PyErr_SetObject(BadPickleGet, py_str);
3869 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003870 }
3871 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003872 PDATA_APPEND(self->stack, value, -1);
3873 rc = 0;
3874 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003876 Py_DECREF(py_str);
3877 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003878}
3879
3880
3881static int
Tim Peterscba30e22003-02-01 06:24:36 +00003882load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003883{
3884 PyObject *py_key = 0, *value = 0;
3885 unsigned char key;
3886 char *s;
3887 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003888
Tim Peters0bc93f52003-02-02 18:29:33 +00003889 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003891 key = (unsigned char)s[0];
3892 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003894 value = PyDict_GetItem(self->memo, py_key);
3895 if (! value) {
3896 PyErr_SetObject(BadPickleGet, py_key);
3897 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003898 }
3899 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003900 PDATA_APPEND(self->stack, value, -1);
3901 rc = 0;
3902 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003903
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003904 Py_DECREF(py_key);
3905 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003906}
3907
3908
3909static int
Tim Peterscba30e22003-02-01 06:24:36 +00003910load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003911{
3912 PyObject *py_key = 0, *value = 0;
3913 unsigned char c;
3914 char *s;
3915 long key;
3916 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003917
Tim Peters0bc93f52003-02-02 18:29:33 +00003918 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003919
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003920 c = (unsigned char)s[0];
3921 key = (long)c;
3922 c = (unsigned char)s[1];
3923 key |= (long)c << 8;
3924 c = (unsigned char)s[2];
3925 key |= (long)c << 16;
3926 c = (unsigned char)s[3];
3927 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003928
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003929 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3930
3931 value = PyDict_GetItem(self->memo, py_key);
3932 if (! value) {
3933 PyErr_SetObject(BadPickleGet, py_key);
3934 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003935 }
3936 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003937 PDATA_APPEND(self->stack, value, -1);
3938 rc = 0;
3939 }
3940
3941 Py_DECREF(py_key);
3942 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003943}
3944
Tim Peters2d629652003-02-04 05:06:17 +00003945/* Push an object from the extension registry (EXT[124]). nbytes is
3946 * the number of bytes following the opcode, holding the index (code) value.
3947 */
3948static int
3949load_extension(Unpicklerobject *self, int nbytes)
3950{
3951 char *codebytes; /* the nbytes bytes after the opcode */
3952 long code; /* calc_binint returns long */
3953 PyObject *py_code; /* code as a Python int */
3954 PyObject *obj; /* the object to push */
3955 PyObject *pair; /* (module_name, class_name) */
3956 PyObject *module_name, *class_name;
3957
3958 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
3959 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
3960 code = calc_binint(codebytes, nbytes);
3961 if (code <= 0) { /* note that 0 is forbidden */
3962 /* Corrupt or hostile pickle. */
3963 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
3964 return -1;
3965 }
3966
3967 /* Look for the code in the cache. */
3968 py_code = PyInt_FromLong(code);
3969 if (py_code == NULL) return -1;
3970 obj = PyDict_GetItem(extension_cache, py_code);
3971 if (obj != NULL) {
3972 /* Bingo. */
3973 Py_DECREF(py_code);
3974 PDATA_APPEND(self->stack, obj, -1);
3975 return 0;
3976 }
3977
3978 /* Look up the (module_name, class_name) pair. */
3979 pair = PyDict_GetItem(inverted_registry, py_code);
3980 if (pair == NULL) {
3981 Py_DECREF(py_code);
3982 PyErr_Format(PyExc_ValueError, "unregistered extension "
3983 "code %ld", code);
3984 return -1;
3985 }
3986 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00003987 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00003988 */
3989 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
3990 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
3991 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
3992 Py_DECREF(py_code);
3993 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
3994 "isn't a 2-tuple of strings", code);
3995 return -1;
3996 }
3997 /* Load the object. */
3998 obj = find_class(module_name, class_name, self->find_class);
3999 if (obj == NULL) {
4000 Py_DECREF(py_code);
4001 return -1;
4002 }
4003 /* Cache code -> obj. */
4004 code = PyDict_SetItem(extension_cache, py_code, obj);
4005 Py_DECREF(py_code);
4006 if (code < 0) {
4007 Py_DECREF(obj);
4008 return -1;
4009 }
4010 PDATA_PUSH(self->stack, obj, -1);
4011 return 0;
4012}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004013
4014static int
Tim Peterscba30e22003-02-01 06:24:36 +00004015load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004016{
4017 PyObject *py_str = 0, *value = 0;
4018 int len, l;
4019 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004020
Tim Peters0bc93f52003-02-02 18:29:33 +00004021 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004022 if (l < 2) return bad_readline();
4023 if (!( len=self->stack->length )) return stackUnderflow();
4024 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
4025 value=self->stack->data[len-1];
4026 l=PyDict_SetItem(self->memo, py_str, value);
4027 Py_DECREF(py_str);
4028 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004029}
4030
4031
4032static int
Tim Peterscba30e22003-02-01 06:24:36 +00004033load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004034{
4035 PyObject *py_key = 0, *value = 0;
4036 unsigned char key;
4037 char *s;
4038 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004039
Tim Peters0bc93f52003-02-02 18:29:33 +00004040 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004041 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004042
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004043 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00004044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004045 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4046 value=self->stack->data[len-1];
4047 len=PyDict_SetItem(self->memo, py_key, value);
4048 Py_DECREF(py_key);
4049 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004050}
4051
4052
4053static int
Tim Peterscba30e22003-02-01 06:24:36 +00004054load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004055{
4056 PyObject *py_key = 0, *value = 0;
4057 long key;
4058 unsigned char c;
4059 char *s;
4060 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004061
Tim Peters0bc93f52003-02-02 18:29:33 +00004062 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004063 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004064
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004065 c = (unsigned char)s[0];
4066 key = (long)c;
4067 c = (unsigned char)s[1];
4068 key |= (long)c << 8;
4069 c = (unsigned char)s[2];
4070 key |= (long)c << 16;
4071 c = (unsigned char)s[3];
4072 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00004073
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004074 if (!( py_key = PyInt_FromLong(key))) return -1;
4075 value=self->stack->data[len-1];
4076 len=PyDict_SetItem(self->memo, py_key, value);
4077 Py_DECREF(py_key);
4078 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004079}
4080
4081
4082static int
Tim Peterscba30e22003-02-01 06:24:36 +00004083do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004084{
4085 PyObject *value = 0, *list = 0, *append_method = 0;
4086 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004088 len=self->stack->length;
4089 if (!( len >= x && x > 0 )) return stackUnderflow();
4090 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00004091 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004092
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004093 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004095 if (PyList_Check(list)) {
4096 PyObject *slice;
4097 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00004098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004099 slice=Pdata_popList(self->stack, x);
4100 list_len = PyList_GET_SIZE(list);
4101 i=PyList_SetSlice(list, list_len, list_len, slice);
4102 Py_DECREF(slice);
4103 return i;
4104 }
4105 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004106
Tim Peterscba30e22003-02-01 06:24:36 +00004107 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004108 return -1;
4109
4110 for (i = x; i < len; i++) {
4111 PyObject *junk;
4112
4113 value=self->stack->data[i];
4114 junk=0;
4115 ARG_TUP(self, value);
4116 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004117 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004118 NULL);
4119 FREE_ARG_TUP(self);
4120 }
4121 if (! junk) {
4122 Pdata_clear(self->stack, i+1);
4123 self->stack->length=x;
4124 Py_DECREF(append_method);
4125 return -1;
4126 }
4127 Py_DECREF(junk);
4128 }
4129 self->stack->length=x;
4130 Py_DECREF(append_method);
4131 }
4132
4133 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004134}
4135
4136
4137static int
Tim Peterscba30e22003-02-01 06:24:36 +00004138load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004139{
4140 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004141}
4142
4143
4144static int
Tim Peterscba30e22003-02-01 06:24:36 +00004145load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004146{
4147 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004148}
4149
4150
4151static int
Tim Peterscba30e22003-02-01 06:24:36 +00004152do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004153{
4154 PyObject *value = 0, *key = 0, *dict = 0;
4155 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004156
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004157 if (!( (len=self->stack->length) >= x
4158 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004160 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004162 for (i = x+1; i < len; i += 2) {
4163 key =self->stack->data[i-1];
4164 value=self->stack->data[i ];
4165 if (PyObject_SetItem(dict, key, value) < 0) {
4166 r=-1;
4167 break;
4168 }
4169 }
4170
4171 Pdata_clear(self->stack, x);
4172
4173 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004174}
4175
4176
Tim Peters84e87f32001-03-17 04:50:51 +00004177static int
Tim Peterscba30e22003-02-01 06:24:36 +00004178load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004179{
4180 return do_setitems(self, self->stack->length - 2);
4181}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004182
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004183static int
Tim Peterscba30e22003-02-01 06:24:36 +00004184load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004185{
4186 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004187}
4188
Tim Peters84e87f32001-03-17 04:50:51 +00004189
Guido van Rossum60456fd1997-04-09 17:36:32 +00004190static int
Tim Peterscba30e22003-02-01 06:24:36 +00004191load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004192{
4193 PyObject *value = 0, *inst = 0, *instdict = 0, *d_key = 0, *d_value = 0,
4194 *junk = 0, *__setstate__ = 0;
4195 int i, r = 0;
4196
4197 if (self->stack->length < 2) return stackUnderflow();
4198 PDATA_POP(self->stack, value);
4199 if (! value) return -1;
4200 inst=self->stack->data[self->stack->length-1];
4201
4202 if ((__setstate__ = PyObject_GetAttr(inst, __setstate___str))) {
4203 ARG_TUP(self, value);
4204 if (self->arg) {
4205 junk = PyObject_Call(__setstate__, self->arg, NULL);
4206 FREE_ARG_TUP(self);
4207 }
4208 Py_DECREF(__setstate__);
4209 if (! junk) return -1;
4210 Py_DECREF(junk);
4211 return 0;
4212 }
4213
4214 PyErr_Clear();
4215 if ((instdict = PyObject_GetAttr(inst, __dict___str))) {
4216 i = 0;
4217 while (PyDict_Next(value, &i, &d_key, &d_value)) {
4218 if (PyObject_SetItem(instdict, d_key, d_value) < 0) {
4219 r=-1;
4220 break;
4221 }
4222 }
4223 Py_DECREF(instdict);
4224 }
4225 else r=-1;
4226
4227 Py_XDECREF(value);
4228
4229 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004230}
4231
4232
4233static int
Tim Peterscba30e22003-02-01 06:24:36 +00004234load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004235{
4236 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004237
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004238 /* Note that we split the (pickle.py) stack into two stacks, an
4239 object stack and a mark stack. Here we push a mark onto the
4240 mark stack.
4241 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004243 if ((self->num_marks + 1) >= self->marks_size) {
4244 s=self->marks_size+20;
4245 if (s <= self->num_marks) s=self->num_marks + 1;
4246 if (self->marks == NULL)
4247 self->marks=(int *)malloc(s * sizeof(int));
4248 else
Tim Peterscba30e22003-02-01 06:24:36 +00004249 self->marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004250 s * sizeof(int));
4251 if (! self->marks) {
4252 PyErr_NoMemory();
4253 return -1;
4254 }
4255 self->marks_size = s;
4256 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004257
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004258 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004259
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004260 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004261}
4262
Guido van Rossum60456fd1997-04-09 17:36:32 +00004263static int
Tim Peterscba30e22003-02-01 06:24:36 +00004264load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004265{
4266 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004268 PDATA_POP(self->stack, arg_tup);
4269 if (! arg_tup) return -1;
4270 PDATA_POP(self->stack, callable);
4271 if (callable) {
4272 ob = Instance_New(callable, arg_tup);
4273 Py_DECREF(callable);
4274 }
4275 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004276
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004277 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004278
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004279 PDATA_PUSH(self->stack, ob, -1);
4280 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004281}
Tim Peters84e87f32001-03-17 04:50:51 +00004282
Tim Peters4190fb82003-02-02 16:09:05 +00004283/* Just raises an error if we don't know the protocol specified. PROTO
4284 * is the first opcode for protocols >= 2.
4285 */
4286static int
4287load_proto(Unpicklerobject *self)
4288{
4289 int i;
4290 char *protobyte;
4291
4292 i = self->read_func(self, &protobyte, 1);
4293 if (i < 0)
4294 return -1;
4295
4296 i = calc_binint(protobyte, 1);
4297 /* No point checking for < 0, since calc_binint returns an unsigned
4298 * int when chewing on 1 byte.
4299 */
4300 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004301 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004302 return 0;
4303
4304 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4305 return -1;
4306}
4307
Guido van Rossum60456fd1997-04-09 17:36:32 +00004308static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004309load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004310{
4311 PyObject *err = 0, *val = 0;
4312 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004314 self->num_marks = 0;
4315 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004316
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004317 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004318 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004319 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004320
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004321 switch (s[0]) {
4322 case NONE:
4323 if (load_none(self) < 0)
4324 break;
4325 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004326
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004327 case BININT:
4328 if (load_binint(self) < 0)
4329 break;
4330 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004331
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004332 case BININT1:
4333 if (load_binint1(self) < 0)
4334 break;
4335 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004336
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004337 case BININT2:
4338 if (load_binint2(self) < 0)
4339 break;
4340 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004342 case INT:
4343 if (load_int(self) < 0)
4344 break;
4345 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004347 case LONG:
4348 if (load_long(self) < 0)
4349 break;
4350 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004351
Tim Petersee1a53c2003-02-02 02:57:53 +00004352 case LONG1:
4353 if (load_counted_long(self, 1) < 0)
4354 break;
4355 continue;
4356
4357 case LONG4:
4358 if (load_counted_long(self, 4) < 0)
4359 break;
4360 continue;
4361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004362 case FLOAT:
4363 if (load_float(self) < 0)
4364 break;
4365 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004366
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004367 case BINFLOAT:
4368 if (load_binfloat(self) < 0)
4369 break;
4370 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004372 case BINSTRING:
4373 if (load_binstring(self) < 0)
4374 break;
4375 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004376
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004377 case SHORT_BINSTRING:
4378 if (load_short_binstring(self) < 0)
4379 break;
4380 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004382 case STRING:
4383 if (load_string(self) < 0)
4384 break;
4385 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004386
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004387#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004388 case UNICODE:
4389 if (load_unicode(self) < 0)
4390 break;
4391 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004393 case BINUNICODE:
4394 if (load_binunicode(self) < 0)
4395 break;
4396 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004397#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004399 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004400 if (load_counted_tuple(self, 0) < 0)
4401 break;
4402 continue;
4403
4404 case TUPLE1:
4405 if (load_counted_tuple(self, 1) < 0)
4406 break;
4407 continue;
4408
4409 case TUPLE2:
4410 if (load_counted_tuple(self, 2) < 0)
4411 break;
4412 continue;
4413
4414 case TUPLE3:
4415 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004416 break;
4417 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004419 case TUPLE:
4420 if (load_tuple(self) < 0)
4421 break;
4422 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004424 case EMPTY_LIST:
4425 if (load_empty_list(self) < 0)
4426 break;
4427 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004428
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004429 case LIST:
4430 if (load_list(self) < 0)
4431 break;
4432 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004434 case EMPTY_DICT:
4435 if (load_empty_dict(self) < 0)
4436 break;
4437 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004439 case DICT:
4440 if (load_dict(self) < 0)
4441 break;
4442 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004443
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004444 case OBJ:
4445 if (load_obj(self) < 0)
4446 break;
4447 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004448
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004449 case INST:
4450 if (load_inst(self) < 0)
4451 break;
4452 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004453
Tim Peterseab7db32003-02-13 18:24:14 +00004454 case NEWOBJ:
4455 if (load_newobj(self) < 0)
4456 break;
4457 continue;
4458
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004459 case GLOBAL:
4460 if (load_global(self) < 0)
4461 break;
4462 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004464 case APPEND:
4465 if (load_append(self) < 0)
4466 break;
4467 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004468
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004469 case APPENDS:
4470 if (load_appends(self) < 0)
4471 break;
4472 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004474 case BUILD:
4475 if (load_build(self) < 0)
4476 break;
4477 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004478
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004479 case DUP:
4480 if (load_dup(self) < 0)
4481 break;
4482 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004483
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004484 case BINGET:
4485 if (load_binget(self) < 0)
4486 break;
4487 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004489 case LONG_BINGET:
4490 if (load_long_binget(self) < 0)
4491 break;
4492 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004493
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004494 case GET:
4495 if (load_get(self) < 0)
4496 break;
4497 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004498
Tim Peters2d629652003-02-04 05:06:17 +00004499 case EXT1:
4500 if (load_extension(self, 1) < 0)
4501 break;
4502 continue;
4503
4504 case EXT2:
4505 if (load_extension(self, 2) < 0)
4506 break;
4507 continue;
4508
4509 case EXT4:
4510 if (load_extension(self, 4) < 0)
4511 break;
4512 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004513 case MARK:
4514 if (load_mark(self) < 0)
4515 break;
4516 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004517
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004518 case BINPUT:
4519 if (load_binput(self) < 0)
4520 break;
4521 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004523 case LONG_BINPUT:
4524 if (load_long_binput(self) < 0)
4525 break;
4526 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004527
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004528 case PUT:
4529 if (load_put(self) < 0)
4530 break;
4531 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004533 case POP:
4534 if (load_pop(self) < 0)
4535 break;
4536 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004537
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004538 case POP_MARK:
4539 if (load_pop_mark(self) < 0)
4540 break;
4541 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004543 case SETITEM:
4544 if (load_setitem(self) < 0)
4545 break;
4546 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004548 case SETITEMS:
4549 if (load_setitems(self) < 0)
4550 break;
4551 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004552
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004553 case STOP:
4554 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004555
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004556 case PERSID:
4557 if (load_persid(self) < 0)
4558 break;
4559 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004561 case BINPERSID:
4562 if (load_binpersid(self) < 0)
4563 break;
4564 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004566 case REDUCE:
4567 if (load_reduce(self) < 0)
4568 break;
4569 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004570
Tim Peters4190fb82003-02-02 16:09:05 +00004571 case PROTO:
4572 if (load_proto(self) < 0)
4573 break;
4574 continue;
4575
Tim Peters3c67d792003-02-02 17:59:11 +00004576 case NEWTRUE:
4577 if (load_bool(self, Py_True) < 0)
4578 break;
4579 continue;
4580
4581 case NEWFALSE:
4582 if (load_bool(self, Py_False) < 0)
4583 break;
4584 continue;
4585
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004586 case '\0':
4587 /* end of file */
4588 PyErr_SetNone(PyExc_EOFError);
4589 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004590
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004591 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004592 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004593 "invalid load key, '%s'.",
4594 "c", s[0]);
4595 return NULL;
4596 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004598 break;
4599 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004600
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004601 if ((err = PyErr_Occurred())) {
4602 if (err == PyExc_EOFError) {
4603 PyErr_SetNone(PyExc_EOFError);
4604 }
4605 return NULL;
4606 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004608 PDATA_POP(self->stack, val);
4609 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004610}
Tim Peters84e87f32001-03-17 04:50:51 +00004611
Guido van Rossum60456fd1997-04-09 17:36:32 +00004612
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004613/* No-load functions to support noload, which is used to
4614 find persistent references. */
4615
4616static int
Tim Peterscba30e22003-02-01 06:24:36 +00004617noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004618{
4619 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004621 if ((i = marker(self)) < 0) return -1;
4622 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004623}
4624
4625
4626static int
Tim Peterscba30e22003-02-01 06:24:36 +00004627noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004628{
4629 int i;
4630 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004631
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004632 if ((i = marker(self)) < 0) return -1;
4633 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004634 if (self->readline_func(self, &s) < 0) return -1;
4635 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00004636 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004637 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004638}
4639
4640static int
Tim Peterseab7db32003-02-13 18:24:14 +00004641noload_newobj(Unpicklerobject *self)
4642{
4643 PyObject *obj;
4644
4645 PDATA_POP(self->stack, obj); /* pop argtuple */
4646 if (obj == NULL) return -1;
4647 Py_DECREF(obj);
4648
4649 PDATA_POP(self->stack, obj); /* pop cls */
4650 if (obj == NULL) return -1;
4651 Py_DECREF(obj);
4652
4653 PDATA_APPEND(self->stack, Py_None, -1);
4654 return 0;
4655}
4656
4657static int
Tim Peterscba30e22003-02-01 06:24:36 +00004658noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004659{
4660 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004661
Tim Peters0bc93f52003-02-02 18:29:33 +00004662 if (self->readline_func(self, &s) < 0) return -1;
4663 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004664 PDATA_APPEND(self->stack, Py_None,-1);
4665 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004666}
4667
4668static int
Tim Peterscba30e22003-02-01 06:24:36 +00004669noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004670{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004672 if (self->stack->length < 2) return stackUnderflow();
4673 Pdata_clear(self->stack, self->stack->length-2);
4674 PDATA_APPEND(self->stack, Py_None,-1);
4675 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004676}
4677
4678static int
4679noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004680
Guido van Rossum053b8df1998-11-25 16:18:00 +00004681 if (self->stack->length < 1) return stackUnderflow();
4682 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004683 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004684}
4685
Tim Peters2d629652003-02-04 05:06:17 +00004686static int
4687noload_extension(Unpicklerobject *self, int nbytes)
4688{
4689 char *codebytes;
4690
4691 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4692 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4693 PDATA_APPEND(self->stack, Py_None, -1);
4694 return 0;
4695}
4696
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004697
4698static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004699noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004700{
4701 PyObject *err = 0, *val = 0;
4702 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004703
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004704 self->num_marks = 0;
4705 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004707 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004708 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004709 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004711 switch (s[0]) {
4712 case NONE:
4713 if (load_none(self) < 0)
4714 break;
4715 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004716
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004717 case BININT:
4718 if (load_binint(self) < 0)
4719 break;
4720 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004722 case BININT1:
4723 if (load_binint1(self) < 0)
4724 break;
4725 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004727 case BININT2:
4728 if (load_binint2(self) < 0)
4729 break;
4730 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004732 case INT:
4733 if (load_int(self) < 0)
4734 break;
4735 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004737 case LONG:
4738 if (load_long(self) < 0)
4739 break;
4740 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004741
Tim Peters4190fb82003-02-02 16:09:05 +00004742 case LONG1:
4743 if (load_counted_long(self, 1) < 0)
4744 break;
4745 continue;
4746
4747 case LONG4:
4748 if (load_counted_long(self, 4) < 0)
4749 break;
4750 continue;
4751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004752 case FLOAT:
4753 if (load_float(self) < 0)
4754 break;
4755 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004757 case BINFLOAT:
4758 if (load_binfloat(self) < 0)
4759 break;
4760 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004762 case BINSTRING:
4763 if (load_binstring(self) < 0)
4764 break;
4765 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004767 case SHORT_BINSTRING:
4768 if (load_short_binstring(self) < 0)
4769 break;
4770 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004772 case STRING:
4773 if (load_string(self) < 0)
4774 break;
4775 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004776
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004777#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004778 case UNICODE:
4779 if (load_unicode(self) < 0)
4780 break;
4781 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004783 case BINUNICODE:
4784 if (load_binunicode(self) < 0)
4785 break;
4786 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004787#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004789 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004790 if (load_counted_tuple(self, 0) < 0)
4791 break;
4792 continue;
4793
4794 case TUPLE1:
4795 if (load_counted_tuple(self, 1) < 0)
4796 break;
4797 continue;
4798
4799 case TUPLE2:
4800 if (load_counted_tuple(self, 2) < 0)
4801 break;
4802 continue;
4803
4804 case TUPLE3:
4805 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004806 break;
4807 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004808
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004809 case TUPLE:
4810 if (load_tuple(self) < 0)
4811 break;
4812 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004814 case EMPTY_LIST:
4815 if (load_empty_list(self) < 0)
4816 break;
4817 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004818
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004819 case LIST:
4820 if (load_list(self) < 0)
4821 break;
4822 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004824 case EMPTY_DICT:
4825 if (load_empty_dict(self) < 0)
4826 break;
4827 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004828
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004829 case DICT:
4830 if (load_dict(self) < 0)
4831 break;
4832 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004833
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004834 case OBJ:
4835 if (noload_obj(self) < 0)
4836 break;
4837 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004839 case INST:
4840 if (noload_inst(self) < 0)
4841 break;
4842 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004843
Tim Peterseab7db32003-02-13 18:24:14 +00004844 case NEWOBJ:
4845 if (noload_newobj(self) < 0)
4846 break;
4847 continue;
4848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004849 case GLOBAL:
4850 if (noload_global(self) < 0)
4851 break;
4852 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004853
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004854 case APPEND:
4855 if (load_append(self) < 0)
4856 break;
4857 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004859 case APPENDS:
4860 if (load_appends(self) < 0)
4861 break;
4862 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004864 case BUILD:
4865 if (noload_build(self) < 0)
4866 break;
4867 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004869 case DUP:
4870 if (load_dup(self) < 0)
4871 break;
4872 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004874 case BINGET:
4875 if (load_binget(self) < 0)
4876 break;
4877 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004879 case LONG_BINGET:
4880 if (load_long_binget(self) < 0)
4881 break;
4882 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004884 case GET:
4885 if (load_get(self) < 0)
4886 break;
4887 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004888
Tim Peters2d629652003-02-04 05:06:17 +00004889 case EXT1:
4890 if (noload_extension(self, 1) < 0)
4891 break;
4892 continue;
4893
4894 case EXT2:
4895 if (noload_extension(self, 2) < 0)
4896 break;
4897 continue;
4898
4899 case EXT4:
4900 if (noload_extension(self, 4) < 0)
4901 break;
4902 continue;
4903
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004904 case MARK:
4905 if (load_mark(self) < 0)
4906 break;
4907 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004908
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004909 case BINPUT:
4910 if (load_binput(self) < 0)
4911 break;
4912 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004914 case LONG_BINPUT:
4915 if (load_long_binput(self) < 0)
4916 break;
4917 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004918
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004919 case PUT:
4920 if (load_put(self) < 0)
4921 break;
4922 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004924 case POP:
4925 if (load_pop(self) < 0)
4926 break;
4927 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004928
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004929 case POP_MARK:
4930 if (load_pop_mark(self) < 0)
4931 break;
4932 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004933
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004934 case SETITEM:
4935 if (load_setitem(self) < 0)
4936 break;
4937 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004939 case SETITEMS:
4940 if (load_setitems(self) < 0)
4941 break;
4942 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004944 case STOP:
4945 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004947 case PERSID:
4948 if (load_persid(self) < 0)
4949 break;
4950 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004951
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004952 case BINPERSID:
4953 if (load_binpersid(self) < 0)
4954 break;
4955 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004957 case REDUCE:
4958 if (noload_reduce(self) < 0)
4959 break;
4960 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004961
Tim Peters4190fb82003-02-02 16:09:05 +00004962 case PROTO:
4963 if (load_proto(self) < 0)
4964 break;
4965 continue;
4966
Tim Peters3c67d792003-02-02 17:59:11 +00004967 case NEWTRUE:
4968 if (load_bool(self, Py_True) < 0)
4969 break;
4970 continue;
4971
4972 case NEWFALSE:
4973 if (load_bool(self, Py_False) < 0)
4974 break;
4975 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004976 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004977 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004978 "invalid load key, '%s'.",
4979 "c", s[0]);
4980 return NULL;
4981 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004983 break;
4984 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004985
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004986 if ((err = PyErr_Occurred())) {
4987 if (err == PyExc_EOFError) {
4988 PyErr_SetNone(PyExc_EOFError);
4989 }
4990 return NULL;
4991 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004992
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004993 PDATA_POP(self->stack, val);
4994 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004995}
Tim Peters84e87f32001-03-17 04:50:51 +00004996
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004997
Guido van Rossum60456fd1997-04-09 17:36:32 +00004998static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004999Unpickler_load(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005000{
Tim Peterscba30e22003-02-01 06:24:36 +00005001 if (!( PyArg_ParseTuple(args, ":load")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005002 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005004 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005005}
5006
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005007static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005008Unpickler_noload(Unpicklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005009{
Tim Peterscba30e22003-02-01 06:24:36 +00005010 if (!( PyArg_ParseTuple(args, ":noload")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005011 return NULL;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005012
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005013 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005014}
5015
Guido van Rossum60456fd1997-04-09 17:36:32 +00005016
5017static struct PyMethodDef Unpickler_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00005018 {"load", (PyCFunction)Unpickler_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005019 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005020 },
Neal Norwitzb0493252002-03-31 14:44:22 +00005021 {"noload", (PyCFunction)Unpickler_noload, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005022 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005023 "noload() -- not load a pickle, but go through most of the motions\n"
5024 "\n"
5025 "This function can be used to read past a pickle without instantiating\n"
5026 "any objects or importing any modules. It can also be used to find all\n"
5027 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00005028 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005029 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00005030 {NULL, NULL} /* sentinel */
5031};
5032
5033
5034static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00005035newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005036{
5037 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005038
Tim Peterscba30e22003-02-01 06:24:36 +00005039 if (!( self = PyObject_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005040 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005042 self->file = NULL;
5043 self->arg = NULL;
5044 self->stack = (Pdata*)Pdata_New();
5045 self->pers_func = NULL;
5046 self->last_string = NULL;
5047 self->marks = NULL;
5048 self->num_marks = 0;
5049 self->marks_size = 0;
5050 self->buf_size = 0;
5051 self->read = NULL;
5052 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005053 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005054
Tim Peterscba30e22003-02-01 06:24:36 +00005055 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005056 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005058 Py_INCREF(f);
5059 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005061 /* Set read, readline based on type of f */
5062 if (PyFile_Check(f)) {
5063 self->fp = PyFile_AsFile(f);
5064 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00005065 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005066 "I/O operation on closed file");
5067 goto err;
5068 }
5069 self->read_func = read_file;
5070 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00005071 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005072 else if (PycStringIO_InputCheck(f)) {
5073 self->fp = NULL;
5074 self->read_func = read_cStringIO;
5075 self->readline_func = readline_cStringIO;
5076 }
5077 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00005078
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005079 self->fp = NULL;
5080 self->read_func = read_other;
5081 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005083 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
5084 (self->read = PyObject_GetAttr(f, read_str)))) {
5085 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00005086 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005087 "argument must have 'read' and "
5088 "'readline' attributes" );
5089 goto err;
5090 }
5091 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00005092
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005093 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005095 err:
5096 Py_DECREF((PyObject *)self);
5097 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005098}
5099
5100
5101static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005102get_Unpickler(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005103{
5104 PyObject *file;
Tim Peters84e87f32001-03-17 04:50:51 +00005105
Tim Peterscba30e22003-02-01 06:24:36 +00005106 if (!( PyArg_ParseTuple(args, "O:Unpickler", &file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005107 return NULL;
5108 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005109}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005110
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005111
Guido van Rossum60456fd1997-04-09 17:36:32 +00005112static void
Tim Peterscba30e22003-02-01 06:24:36 +00005113Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005114{
5115 Py_XDECREF(self->readline);
5116 Py_XDECREF(self->read);
5117 Py_XDECREF(self->file);
5118 Py_XDECREF(self->memo);
5119 Py_XDECREF(self->stack);
5120 Py_XDECREF(self->pers_func);
5121 Py_XDECREF(self->arg);
5122 Py_XDECREF(self->last_string);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005123
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005124 if (self->marks) {
5125 free(self->marks);
5126 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005128 if (self->buf_size) {
5129 free(self->buf);
5130 }
Tim Peters84e87f32001-03-17 04:50:51 +00005131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005132 PyObject_Del(self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005133}
5134
5135
5136static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005137Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005138{
5139 if (!strcmp(name, "persistent_load")) {
5140 if (!self->pers_func) {
5141 PyErr_SetString(PyExc_AttributeError, name);
5142 return NULL;
5143 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005144
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005145 Py_INCREF(self->pers_func);
5146 return self->pers_func;
5147 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005148
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005149 if (!strcmp(name, "find_global")) {
5150 if (!self->find_class) {
5151 PyErr_SetString(PyExc_AttributeError, name);
5152 return NULL;
5153 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005155 Py_INCREF(self->find_class);
5156 return self->find_class;
5157 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005159 if (!strcmp(name, "memo")) {
5160 if (!self->memo) {
5161 PyErr_SetString(PyExc_AttributeError, name);
5162 return NULL;
5163 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005165 Py_INCREF(self->memo);
5166 return self->memo;
5167 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005168
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005169 if (!strcmp(name, "UnpicklingError")) {
5170 Py_INCREF(UnpicklingError);
5171 return UnpicklingError;
5172 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005173
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005174 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005175}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005176
Guido van Rossum60456fd1997-04-09 17:36:32 +00005177
5178static int
Tim Peterscba30e22003-02-01 06:24:36 +00005179Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005180{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005182 if (!strcmp(name, "persistent_load")) {
5183 Py_XDECREF(self->pers_func);
5184 self->pers_func = value;
5185 Py_XINCREF(value);
5186 return 0;
5187 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005188
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005189 if (!strcmp(name, "find_global")) {
5190 Py_XDECREF(self->find_class);
5191 self->find_class = value;
5192 Py_XINCREF(value);
5193 return 0;
5194 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005196 if (! value) {
5197 PyErr_SetString(PyExc_TypeError,
5198 "attribute deletion is not supported");
5199 return -1;
5200 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005201
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005202 if (strcmp(name, "memo") == 0) {
5203 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005204 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005205 "memo must be a dictionary");
5206 return -1;
5207 }
5208 Py_XDECREF(self->memo);
5209 self->memo = value;
5210 Py_INCREF(value);
5211 return 0;
5212 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005214 PyErr_SetString(PyExc_AttributeError, name);
5215 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005216}
5217
Tim Peters5bd2a792003-02-01 16:45:06 +00005218/* ---------------------------------------------------------------------------
5219 * Module-level functions.
5220 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005221
Tim Peters5bd2a792003-02-01 16:45:06 +00005222/* dump(obj, file, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005223static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005224cpm_dump(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005225{
5226 PyObject *ob, *file, *res = NULL;
5227 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005228 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005229
Tim Peters5bd2a792003-02-01 16:45:06 +00005230 if (!( PyArg_ParseTuple(args, "OO|i", &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005231 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005232
Tim Peters5bd2a792003-02-01 16:45:06 +00005233 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005234 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005235
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005236 if (dump(pickler, ob) < 0)
5237 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005239 Py_INCREF(Py_None);
5240 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005241
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005242 finally:
5243 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005245 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005246}
5247
5248
Tim Peters5bd2a792003-02-01 16:45:06 +00005249/* dumps(obj, proto=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005250static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005251cpm_dumps(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005252{
5253 PyObject *ob, *file = 0, *res = NULL;
5254 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005255 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005256
Tim Peters5bd2a792003-02-01 16:45:06 +00005257 if (!( PyArg_ParseTuple(args, "O|i:dumps", &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005258 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005259
Tim Peterscba30e22003-02-01 06:24:36 +00005260 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005261 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005262
Tim Peters5bd2a792003-02-01 16:45:06 +00005263 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005264 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005265
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005266 if (dump(pickler, ob) < 0)
5267 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005268
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005269 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005270
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005271 finally:
5272 Py_XDECREF(pickler);
5273 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005275 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005276}
5277
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005278
Tim Peters5bd2a792003-02-01 16:45:06 +00005279/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005280static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005281cpm_load(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005282{
5283 Unpicklerobject *unpickler = 0;
5284 PyObject *ob, *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005285
Tim Peterscba30e22003-02-01 06:24:36 +00005286 if (!( PyArg_ParseTuple(args, "O:load", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005287 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005288
Tim Peterscba30e22003-02-01 06:24:36 +00005289 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005290 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005291
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005292 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005294 finally:
5295 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005297 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005298}
5299
5300
Tim Peters5bd2a792003-02-01 16:45:06 +00005301/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005302static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005303cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005304{
5305 PyObject *ob, *file = 0, *res = NULL;
5306 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005307
Tim Peterscba30e22003-02-01 06:24:36 +00005308 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005309 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005310
Tim Peterscba30e22003-02-01 06:24:36 +00005311 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005312 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005313
Tim Peterscba30e22003-02-01 06:24:36 +00005314 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005315 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005316
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005317 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005318
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005319 finally:
5320 Py_XDECREF(file);
5321 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005322
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005323 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005324}
5325
5326
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005327PyDoc_STRVAR(Unpicklertype__doc__,
5328"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005329
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005330static PyTypeObject Unpicklertype = {
5331 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00005332 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00005333 "cPickle.Unpickler", /*tp_name*/
Guido van Rossum60456fd1997-04-09 17:36:32 +00005334 sizeof(Unpicklerobject), /*tp_basicsize*/
5335 0, /*tp_itemsize*/
5336 /* methods */
5337 (destructor)Unpickler_dealloc, /*tp_dealloc*/
5338 (printfunc)0, /*tp_print*/
5339 (getattrfunc)Unpickler_getattr, /*tp_getattr*/
5340 (setattrfunc)Unpickler_setattr, /*tp_setattr*/
5341 (cmpfunc)0, /*tp_compare*/
5342 (reprfunc)0, /*tp_repr*/
5343 0, /*tp_as_number*/
5344 0, /*tp_as_sequence*/
5345 0, /*tp_as_mapping*/
5346 (hashfunc)0, /*tp_hash*/
5347 (ternaryfunc)0, /*tp_call*/
5348 (reprfunc)0, /*tp_str*/
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005349
Guido van Rossum60456fd1997-04-09 17:36:32 +00005350 /* Space for future expansion */
5351 0L,0L,0L,0L,
5352 Unpicklertype__doc__ /* Documentation string */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005353};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005354
Guido van Rossum60456fd1997-04-09 17:36:32 +00005355static struct PyMethodDef cPickle_methods[] = {
Neal Norwitzb0493252002-03-31 14:44:22 +00005356 {"dump", (PyCFunction)cpm_dump, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005357 PyDoc_STR("dump(object, file, proto=0) -- "
5358 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005359 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005360 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005361 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005362
Neal Norwitzb0493252002-03-31 14:44:22 +00005363 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005364 PyDoc_STR("dumps(object, proto=0) -- "
5365 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005366 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005367 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005368 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005369
Neal Norwitzb0493252002-03-31 14:44:22 +00005370 {"load", (PyCFunction)cpm_load, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005371 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005372
Neal Norwitzb0493252002-03-31 14:44:22 +00005373 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005374 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005375
Neal Norwitzb0493252002-03-31 14:44:22 +00005376 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005377 PyDoc_STR("Pickler(file, proto=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005378 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005379 "This takes a file-like object for writing a pickle data stream.\n"
5380 "The optional proto argument tells the pickler to use the given\n"
5381 "protocol; supported protocols are 0, 1, 2. The default\n"
5382 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5383 "only protocol that can be written to a file opened in text\n"
5384 "mode and read back successfully. When using a protocol higher\n"
5385 "than 0, make sure the file is opened in binary mode, both when\n"
5386 "pickling and unpickling.)\n"
5387 "\n"
5388 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5389 "more efficient than protocol 1.\n"
5390 "\n"
5391 "Specifying a negative protocol version selects the highest\n"
5392 "protocol version supported. The higher the protocol used, the\n"
5393 "more recent the version of Python needed to read the pickle\n"
5394 "produced.\n"
5395 "\n"
5396 "The file parameter must have a write() method that accepts a single\n"
5397 "string argument. It can thus be an open file object, a StringIO\n"
5398 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005399 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005400
Neal Norwitzb0493252002-03-31 14:44:22 +00005401 {"Unpickler", (PyCFunction)get_Unpickler, METH_VARARGS,
Tim Peters5bd2a792003-02-01 16:45:06 +00005402 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5403
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005404 { NULL, NULL }
5405};
5406
Guido van Rossum60456fd1997-04-09 17:36:32 +00005407static int
Tim Peterscba30e22003-02-01 06:24:36 +00005408init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005409{
5410 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005411
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00005412#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005413
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005414 INIT_STR(__class__);
5415 INIT_STR(__getinitargs__);
5416 INIT_STR(__dict__);
5417 INIT_STR(__getstate__);
5418 INIT_STR(__setstate__);
5419 INIT_STR(__name__);
5420 INIT_STR(__main__);
5421 INIT_STR(__reduce__);
5422 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005423 INIT_STR(append);
5424 INIT_STR(read);
5425 INIT_STR(readline);
5426 INIT_STR(copy_reg);
5427 INIT_STR(dispatch_table);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005428 INIT_STR(__basicnew__);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005429
Tim Peterscba30e22003-02-01 06:24:36 +00005430 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005431 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005432
Tim Peters1f1b2d22003-02-01 02:16:37 +00005433 /* This is special because we want to use a different
5434 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005435 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005436 if (!dispatch_table) return -1;
5437
5438 extension_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005439 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005440 if (!extension_registry) return -1;
5441
5442 inverted_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005443 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005444 if (!inverted_registry) return -1;
5445
5446 extension_cache = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005447 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005448 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005450 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005451
Tim Peters731098b2003-02-04 20:56:09 +00005452 if (!(empty_tuple = PyTuple_New(0)))
5453 return -1;
5454
5455 two_tuple = PyTuple_New(2);
5456 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005457 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005458 /* We use this temp container with no regard to refcounts, or to
5459 * keeping containees alive. Exempt from GC, because we don't
5460 * want anything looking at two_tuple() by magic.
5461 */
5462 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005464 /* Ugh */
5465 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5466 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5467 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005468
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005469 if (!( t=PyDict_New())) return -1;
5470 if (!( r=PyRun_String(
5471 "def __init__(self, *args): self.args=args\n\n"
5472 "def __str__(self):\n"
5473 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5474 Py_file_input,
5475 module_dict, t) )) return -1;
5476 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005477
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005478 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005479 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005480 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005481
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005482 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005483
Tim Peterscba30e22003-02-01 06:24:36 +00005484 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005485 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005486 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005487 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005489 if (!( t=PyDict_New())) return -1;
5490 if (!( r=PyRun_String(
5491 "def __init__(self, *args): self.args=args\n\n"
5492 "def __str__(self):\n"
5493 " a=self.args\n"
5494 " a=a and type(a[0]) or '(what)'\n"
5495 " return 'Cannot pickle %s objects' % a\n"
5496 , Py_file_input,
5497 module_dict, t) )) return -1;
5498 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005499
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005500 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005501 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005502 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005503
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005504 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005506 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005507 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005508 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005509
Martin v. Löwis658009a2002-09-16 17:26:24 +00005510 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5511 UnpicklingError, NULL)))
5512 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005513
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005514 if (PyDict_SetItemString(module_dict, "PickleError",
5515 PickleError) < 0)
5516 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005517
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005518 if (PyDict_SetItemString(module_dict, "PicklingError",
5519 PicklingError) < 0)
5520 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005521
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005522 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5523 UnpicklingError) < 0)
5524 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005525
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005526 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5527 UnpickleableError) < 0)
5528 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005530 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5531 BadPickleGet) < 0)
5532 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005534 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005536 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005537}
5538
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005539#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5540#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005541#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005542PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005543initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005544{
5545 PyObject *m, *d, *di, *v, *k;
5546 int i;
Tim Peters5b7da392003-02-04 00:21:07 +00005547 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005548 PyObject *format_version;
5549 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005550
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005551 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005552 Unpicklertype.ob_type = &PyType_Type;
5553 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005555 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005556 * so we're forced to use a temporary dictionary. :(
5557 */
5558 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005559 if (!di) return;
5560 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005562 /* Create the module and add the functions */
5563 m = Py_InitModule4("cPickle", cPickle_methods,
5564 cPickle_module_documentation,
5565 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005567 /* Add some symbolic constants to the module */
5568 d = PyModule_GetDict(m);
Tim Peters5b7da392003-02-04 00:21:07 +00005569 v = PyString_FromString(rev);
5570 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005571 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005572
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005573 /* Copy data from di. Waaa. */
5574 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5575 if (PyObject_SetItem(d, k, v) < 0) {
5576 Py_DECREF(di);
5577 return;
5578 }
5579 }
5580 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005581
Tim Peters8587b3c2003-02-13 15:44:41 +00005582 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
5583 if (i < 0)
5584 return;
5585
Tim Peters5b7da392003-02-04 00:21:07 +00005586 /* These are purely informational; no code uses them. */
5587 /* File format version we write. */
5588 format_version = PyString_FromString("2.0");
5589 /* Format versions we can read. */
5590 compatible_formats = Py_BuildValue("[sssss]",
5591 "1.0", /* Original protocol 0 */
5592 "1.1", /* Protocol 0 + INST */
5593 "1.2", /* Original protocol 1 */
5594 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005595 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005596 PyDict_SetItemString(d, "format_version", format_version);
5597 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5598 Py_XDECREF(format_version);
5599 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005600}