blob: 79ccb3e9376146b12ef3d199cea1c5194d27af38 [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,
Guido van Rossumb289b872003-02-19 01:45:13 +0000124 *__reduce_ex___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000125 *write_str, *append_str,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000126 *read_str, *readline_str, *__main___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000127 *copy_reg_str, *dispatch_table_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000128
Guido van Rossum053b8df1998-11-25 16:18:00 +0000129/*************************************************************************
130 Internal Data type for pickle data. */
131
132typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000133 PyObject_HEAD
Tim Peters1d63c9f2003-02-02 20:29:39 +0000134 int length; /* number of initial slots in data currently used */
135 int size; /* number of slots in data allocated */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000136 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000137} Pdata;
138
Tim Peters84e87f32001-03-17 04:50:51 +0000139static void
Tim Peterscba30e22003-02-01 06:24:36 +0000140Pdata_dealloc(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000141{
142 int i;
143 PyObject **p;
Tim Peterscba30e22003-02-01 06:24:36 +0000144
Tim Peters1d63c9f2003-02-02 20:29:39 +0000145 for (i = self->length, p = self->data; --i >= 0; p++) {
146 Py_DECREF(*p);
147 }
148 if (self->data)
149 free(self->data);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000150 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000151}
152
153static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000154 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
155 (destructor)Pdata_dealloc,
156 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000157};
158
159#define Pdata_Check(O) ((O)->ob_type == &PdataType)
160
161static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000162Pdata_New(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000163{
164 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000165
Tim Peters1d63c9f2003-02-02 20:29:39 +0000166 if (!(self = PyObject_New(Pdata, &PdataType)))
167 return NULL;
168 self->size = 8;
169 self->length = 0;
170 self->data = malloc(self->size * sizeof(PyObject*));
171 if (self->data)
172 return (PyObject*)self;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000173 Py_DECREF(self);
174 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000175}
176
Tim Peters84e87f32001-03-17 04:50:51 +0000177static int
Tim Peterscba30e22003-02-01 06:24:36 +0000178stackUnderflow(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000179{
180 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
181 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000182}
183
Tim Peters1d63c9f2003-02-02 20:29:39 +0000184/* Retain only the initial clearto items. If clearto >= the current
185 * number of items, this is a (non-erroneous) NOP.
186 */
Guido van Rossum053b8df1998-11-25 16:18:00 +0000187static int
Tim Peterscba30e22003-02-01 06:24:36 +0000188Pdata_clear(Pdata *self, int clearto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000189{
190 int i;
191 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000193 if (clearto < 0) return stackUnderflow();
194 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000195
Tim Peters1d63c9f2003-02-02 20:29:39 +0000196 for (i = self->length, p = self->data + clearto;
197 --i >= clearto;
198 p++) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000199 Py_CLEAR(*p);
Tim Peters1d63c9f2003-02-02 20:29:39 +0000200 }
201 self->length = clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000203 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000204}
205
Tim Peters84e87f32001-03-17 04:50:51 +0000206static int
Tim Peterscba30e22003-02-01 06:24:36 +0000207Pdata_grow(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000208{
Tim Peters1d63c9f2003-02-02 20:29:39 +0000209 int bigger;
210 size_t nbytes;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000211 PyObject **tmp;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000212
Tim Peters1d63c9f2003-02-02 20:29:39 +0000213 bigger = self->size << 1;
Tim Peterse0a39072003-02-03 15:45:56 +0000214 if (bigger <= 0) /* was 0, or new value overflows */
Tim Peters1d63c9f2003-02-02 20:29:39 +0000215 goto nomemory;
216 if ((int)(size_t)bigger != bigger)
217 goto nomemory;
218 nbytes = (size_t)bigger * sizeof(PyObject *);
219 if (nbytes / sizeof(PyObject *) != (size_t)bigger)
220 goto nomemory;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000221 tmp = realloc(self->data, nbytes);
222 if (tmp == NULL)
Tim Peters1d63c9f2003-02-02 20:29:39 +0000223 goto nomemory;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000224 self->data = tmp;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000225 self->size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000226 return 0;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000227
228 nomemory:
Tim Peters1d63c9f2003-02-02 20:29:39 +0000229 PyErr_NoMemory();
230 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000231}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000232
Tim Peterse0a39072003-02-03 15:45:56 +0000233/* D is a Pdata*. Pop the topmost element and store it into V, which
234 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
Tim Peters1d63c9f2003-02-02 20:29:39 +0000235 * is raised and V is set to NULL. D and V may be evaluated several times.
236 */
237#define PDATA_POP(D, V) { \
Tim Peterse0a39072003-02-03 15:45:56 +0000238 if ((D)->length) \
239 (V) = (D)->data[--((D)->length)]; \
240 else { \
241 PyErr_SetString(UnpicklingError, "bad pickle data"); \
242 (V) = NULL; \
243 } \
Guido van Rossum053b8df1998-11-25 16:18:00 +0000244}
245
Tim Peterse0a39072003-02-03 15:45:56 +0000246/* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata*
247 * D. If the Pdata stack can't be grown to hold the new value, both
248 * raise MemoryError and execute "return ER". The difference is in ownership
249 * of O after: _PUSH transfers ownership of O from the caller to the stack
250 * (no incref of O is done, and in case of error O is decrefed), while
251 * _APPEND pushes a new reference.
252 */
253
254/* Push O on stack D, giving ownership of O to the stack. */
255#define PDATA_PUSH(D, O, ER) { \
256 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
257 Pdata_grow((Pdata*)(D)) < 0) { \
258 Py_DECREF(O); \
259 return ER; \
260 } \
261 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
262}
263
264/* Push O on stack D, pushing a new reference. */
265#define PDATA_APPEND(D, O, ER) { \
266 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
267 Pdata_grow((Pdata*)(D)) < 0) \
268 return ER; \
269 Py_INCREF(O); \
270 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
271}
272
273
Guido van Rossum053b8df1998-11-25 16:18:00 +0000274static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000275Pdata_popTuple(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000276{
277 PyObject *r;
278 int i, j, l;
Tim Peterscba30e22003-02-01 06:24:36 +0000279
Tim Peters1d63c9f2003-02-02 20:29:39 +0000280 l = self->length-start;
281 r = PyTuple_New(l);
282 if (r == NULL)
283 return NULL;
284 for (i = start, j = 0 ; j < l; i++, j++)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000285 PyTuple_SET_ITEM(r, j, self->data[i]);
Tim Peterscba30e22003-02-01 06:24:36 +0000286
Tim Peters1d63c9f2003-02-02 20:29:39 +0000287 self->length = start;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000288 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000289}
290
291static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000292Pdata_popList(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000293{
294 PyObject *r;
295 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000297 l=self->length-start;
298 if (!( r=PyList_New(l))) return NULL;
299 for (i=start, j=0 ; j < l; i++, j++)
300 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000302 self->length=start;
303 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000304}
305
Guido van Rossum053b8df1998-11-25 16:18:00 +0000306/*************************************************************************/
307
308#define ARG_TUP(self, o) { \
309 if (self->arg || (self->arg=PyTuple_New(1))) { \
310 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
311 PyTuple_SET_ITEM(self->arg,0,o); \
312 } \
313 else { \
314 Py_DECREF(o); \
315 } \
316}
317
318#define FREE_ARG_TUP(self) { \
319 if (self->arg->ob_refcnt > 1) { \
320 Py_DECREF(self->arg); \
321 self->arg=NULL; \
322 } \
323 }
324
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000325typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000326 PyObject_HEAD
327 FILE *fp;
328 PyObject *write;
329 PyObject *file;
330 PyObject *memo;
331 PyObject *arg;
332 PyObject *pers_func;
333 PyObject *inst_pers_func;
Tim Peters797ec242003-02-01 06:22:36 +0000334
335 /* pickle protocol number, >= 0 */
336 int proto;
337
338 /* bool, true if proto > 0 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000339 int bin;
Tim Peters797ec242003-02-01 06:22:36 +0000340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000341 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis5a395302002-08-04 08:20:23 +0000342 int nesting;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000343 int (*write_func)(struct Picklerobject *, const char *, Py_ssize_t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000344 char *write_buf;
345 int buf_size;
346 PyObject *dispatch_table;
347 int fast_container; /* count nested container dumps */
348 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000349} Picklerobject;
350
Barry Warsaw52acb492001-12-21 20:04:22 +0000351#ifndef PY_CPICKLE_FAST_LIMIT
352#define PY_CPICKLE_FAST_LIMIT 50
353#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000354
Jeremy Hylton938ace62002-07-17 16:30:39 +0000355static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000356
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000357typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000358 PyObject_HEAD
359 FILE *fp;
360 PyObject *file;
361 PyObject *readline;
362 PyObject *read;
363 PyObject *memo;
364 PyObject *arg;
365 Pdata *stack;
366 PyObject *mark;
367 PyObject *pers_func;
368 PyObject *last_string;
369 int *marks;
370 int num_marks;
371 int marks_size;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000372 Py_ssize_t (*read_func)(struct Unpicklerobject *, char **, Py_ssize_t);
373 Py_ssize_t (*readline_func)(struct Unpicklerobject *, char **);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000374 int buf_size;
375 char *buf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000376 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000377} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000378
Jeremy Hylton938ace62002-07-17 16:30:39 +0000379static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000380
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000381/* Forward decls that need the above structs */
382static int save(Picklerobject *, PyObject *, int);
383static int put2(Picklerobject *, PyObject *);
384
Guido van Rossumd385d591997-04-09 17:47:47 +0000385static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000386PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000387cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
388{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000389 va_list va;
390 PyObject *args=0, *retval=0;
391 va_start(va, format);
Tim Peterscba30e22003-02-01 06:24:36 +0000392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000393 if (format) args = Py_VaBuildValue(format, va);
394 va_end(va);
395 if (format && ! args) return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000396 if (stringformat && !(retval=PyString_FromString(stringformat)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000397 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000399 if (retval) {
400 if (args) {
401 PyObject *v;
402 v=PyString_Format(retval, args);
403 Py_DECREF(retval);
404 Py_DECREF(args);
405 if (! v) return NULL;
406 retval=v;
407 }
408 }
409 else
410 if (args) retval=args;
411 else {
412 PyErr_SetObject(ErrType,Py_None);
413 return NULL;
414 }
415 PyErr_SetObject(ErrType,retval);
416 Py_DECREF(retval);
417 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000418}
419
Tim Peters84e87f32001-03-17 04:50:51 +0000420static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000421write_file(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000422{
423 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000425 if (s == NULL) {
426 return 0;
427 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000428
Martin v. Löwis18e16552006-02-15 17:27:45 +0000429 if (n > INT_MAX) {
430 /* String too large */
431 return -1;
432 }
433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000434 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000435 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000436 Py_END_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000437 if (nbyteswritten != (size_t)n) {
438 PyErr_SetFromErrno(PyExc_IOError);
439 return -1;
440 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000441
Martin v. Löwis18e16552006-02-15 17:27:45 +0000442 return (int)n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000443}
444
Tim Peters84e87f32001-03-17 04:50:51 +0000445static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000446write_cStringIO(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000447{
448 if (s == NULL) {
449 return 0;
450 }
Tim Peterscba30e22003-02-01 06:24:36 +0000451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000452 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
453 return -1;
454 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000455
Martin v. Löwis18e16552006-02-15 17:27:45 +0000456 return (int)n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000457}
458
Tim Peters84e87f32001-03-17 04:50:51 +0000459static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000460write_none(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000461{
462 if (s == NULL) return 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000463 if (n > INT_MAX) return -1;
464 return (int)n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000465}
466
Tim Peters84e87f32001-03-17 04:50:51 +0000467static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000468write_other(Picklerobject *self, const char *s, Py_ssize_t _n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000469{
470 PyObject *py_str = 0, *junk = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000471 int n;
Tim Peterscba30e22003-02-01 06:24:36 +0000472
Martin v. Löwis18e16552006-02-15 17:27:45 +0000473 if (_n > INT_MAX)
474 return -1;
475 n = (int)_n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000476 if (s == NULL) {
477 if (!( self->buf_size )) return 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000478 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000479 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000480 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000481 return -1;
482 }
483 else {
484 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
485 if (write_other(self, NULL, 0) < 0)
486 return -1;
487 }
Tim Peterscba30e22003-02-01 06:24:36 +0000488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000489 if (n > WRITE_BUF_SIZE) {
490 if (!( py_str =
Tim Peterscba30e22003-02-01 06:24:36 +0000491 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000492 return -1;
493 }
494 else {
495 memcpy(self->write_buf + self->buf_size, s, n);
496 self->buf_size += n;
497 return n;
498 }
499 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000501 if (self->write) {
502 /* object with write method */
503 ARG_TUP(self, py_str);
504 if (self->arg) {
505 junk = PyObject_Call(self->write, self->arg, NULL);
506 FREE_ARG_TUP(self);
507 }
508 if (junk) Py_DECREF(junk);
509 else return -1;
510 }
511 else
512 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000513
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000514 self->buf_size = 0;
515 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000516}
517
518
Martin v. Löwis18e16552006-02-15 17:27:45 +0000519static Py_ssize_t
520read_file(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000521{
522 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000524 if (self->buf_size == 0) {
525 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000527 size = ((n < 32) ? 32 : n);
Tim Petersee1a53c2003-02-02 02:57:53 +0000528 if (!( self->buf = (char *)malloc(size))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000529 PyErr_NoMemory();
530 return -1;
531 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000533 self->buf_size = size;
534 }
535 else if (n > self->buf_size) {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000536 char *newbuf = (char *)realloc(self->buf, n);
537 if (!newbuf) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000538 PyErr_NoMemory();
539 return -1;
540 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000541 self->buf = newbuf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000542 self->buf_size = n;
543 }
Tim Peters84e87f32001-03-17 04:50:51 +0000544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000545 Py_BEGIN_ALLOW_THREADS
546 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
547 Py_END_ALLOW_THREADS
548 if (nbytesread != (size_t)n) {
549 if (feof(self->fp)) {
550 PyErr_SetNone(PyExc_EOFError);
551 return -1;
552 }
Tim Peterscba30e22003-02-01 06:24:36 +0000553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000554 PyErr_SetFromErrno(PyExc_IOError);
555 return -1;
556 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000558 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000559
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000560 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000561}
562
563
Martin v. Löwis18e16552006-02-15 17:27:45 +0000564static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000565readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000566{
567 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000569 if (self->buf_size == 0) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000570 if (!( self->buf = (char *)malloc(40))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000571 PyErr_NoMemory();
572 return -1;
573 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000574 self->buf_size = 40;
575 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000577 i = 0;
578 while (1) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000579 int bigger;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000580 char *newbuf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000581 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000582 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000583 (self->buf[i] = getc(self->fp)) == '\n') {
584 self->buf[i + 1] = '\0';
585 *s = self->buf;
586 return i + 1;
587 }
588 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000589 bigger = self->buf_size << 1;
590 if (bigger <= 0) { /* overflow */
591 PyErr_NoMemory();
592 return -1;
593 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000594 newbuf = (char *)realloc(self->buf, bigger);
595 if (!newbuf) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000596 PyErr_NoMemory();
597 return -1;
598 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000599 self->buf = newbuf;
Tim Petersee1a53c2003-02-02 02:57:53 +0000600 self->buf_size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000601 }
Tim Peters84e87f32001-03-17 04:50:51 +0000602}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000603
604
Martin v. Löwis18e16552006-02-15 17:27:45 +0000605static Py_ssize_t
606read_cStringIO(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000607{
608 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000610 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
611 PyErr_SetNone(PyExc_EOFError);
612 return -1;
613 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000614
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000615 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000617 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000618}
619
620
Martin v. Löwis18e16552006-02-15 17:27:45 +0000621static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000622readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000623{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000624 Py_ssize_t n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000625 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000627 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
628 return -1;
629 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000631 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000632
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000633 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000634}
635
636
Martin v. Löwis18e16552006-02-15 17:27:45 +0000637static Py_ssize_t
638read_other(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000639{
640 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000641
Martin v. Löwis18e16552006-02-15 17:27:45 +0000642 if (!( bytes = PyInt_FromSsize_t(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000644 ARG_TUP(self, bytes);
645 if (self->arg) {
646 str = PyObject_Call(self->read, self->arg, NULL);
647 FREE_ARG_TUP(self);
648 }
649 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000651 Py_XDECREF(self->last_string);
652 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000654 if (! (*s = PyString_AsString(str))) return -1;
655 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000656}
657
658
Martin v. Löwis18e16552006-02-15 17:27:45 +0000659static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000660readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000661{
662 PyObject *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000663 Py_ssize_t str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000665 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
666 return -1;
667 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000669 if ((str_size = PyString_Size(str)) < 0)
670 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000672 Py_XDECREF(self->last_string);
673 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000675 if (! (*s = PyString_AsString(str)))
676 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000677
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000678 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000679}
680
Tim Petersee1a53c2003-02-02 02:57:53 +0000681/* Copy the first n bytes from s into newly malloc'ed memory, plus a
682 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
683 * The caller is responsible for free()'ing the return value.
684 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000685static char *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000686pystrndup(const char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000687{
Tim Petersee1a53c2003-02-02 02:57:53 +0000688 char *r = (char *)malloc(n+1);
689 if (r == NULL)
690 return (char*)PyErr_NoMemory();
691 memcpy(r, s, n);
692 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000693 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000694}
695
696
697static int
Tim Peterscba30e22003-02-01 06:24:36 +0000698get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000699{
700 PyObject *value, *mv;
701 long c_value;
702 char s[30];
703 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000705 if (!( mv = PyDict_GetItem(self->memo, id))) {
706 PyErr_SetObject(PyExc_KeyError, id);
707 return -1;
708 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000709
Tim Peterscba30e22003-02-01 06:24:36 +0000710 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000711 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000713 if (!( PyInt_Check(value))) {
714 PyErr_SetString(PicklingError, "no int where int expected in memo");
715 return -1;
716 }
Guido van Rossumddefaf32007-01-14 03:31:43 +0000717 c_value = PyInt_AsLong(value);
718 if (c_value == -1 && PyErr_Occurred())
719 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000721 if (!self->bin) {
722 s[0] = GET;
723 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
724 len = strlen(s);
725 }
726 else if (Pdata_Check(self->file)) {
727 if (write_other(self, NULL, 0) < 0) return -1;
728 PDATA_APPEND(self->file, mv, -1);
729 return 0;
730 }
731 else {
732 if (c_value < 256) {
733 s[0] = BINGET;
734 s[1] = (int)(c_value & 0xff);
735 len = 2;
736 }
737 else {
738 s[0] = LONG_BINGET;
739 s[1] = (int)(c_value & 0xff);
740 s[2] = (int)((c_value >> 8) & 0xff);
741 s[3] = (int)((c_value >> 16) & 0xff);
742 s[4] = (int)((c_value >> 24) & 0xff);
743 len = 5;
744 }
745 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000746
Tim Peters0bc93f52003-02-02 18:29:33 +0000747 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000748 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000749
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000750 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000751}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000752
Guido van Rossum60456fd1997-04-09 17:36:32 +0000753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000754static int
Tim Peterscba30e22003-02-01 06:24:36 +0000755put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000756{
Tim Peterscba30e22003-02-01 06:24:36 +0000757 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000758 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000760 return put2(self, ob);
761}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000762
Guido van Rossum053b8df1998-11-25 16:18:00 +0000763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000764static int
Tim Peterscba30e22003-02-01 06:24:36 +0000765put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000766{
767 char c_str[30];
768 int p;
769 size_t len;
770 int res = -1;
771 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000773 if (self->fast)
774 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000776 if ((p = PyDict_Size(self->memo)) < 0)
777 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000779 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000780 /* XXX Why?
781 * XXX And does "positive" really mean non-negative?
782 * XXX pickle.py starts with PUT index 0, not 1. This makes for
783 * XXX gratuitous differences between the pickling modules.
784 */
Tim Peterscba30e22003-02-01 06:24:36 +0000785 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000786
Tim Peterscba30e22003-02-01 06:24:36 +0000787 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000788 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000789
Tim Peterscba30e22003-02-01 06:24:36 +0000790 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000791 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000792
Tim Peterscba30e22003-02-01 06:24:36 +0000793 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000794 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000796 PyTuple_SET_ITEM(t, 0, memo_len);
797 Py_INCREF(memo_len);
798 PyTuple_SET_ITEM(t, 1, ob);
799 Py_INCREF(ob);
800
801 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
802 goto finally;
803
804 if (!self->bin) {
805 c_str[0] = PUT;
806 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
807 len = strlen(c_str);
808 }
809 else if (Pdata_Check(self->file)) {
810 if (write_other(self, NULL, 0) < 0) return -1;
811 PDATA_APPEND(self->file, memo_len, -1);
812 res=0; /* Job well done ;) */
813 goto finally;
814 }
815 else {
816 if (p >= 256) {
817 c_str[0] = LONG_BINPUT;
818 c_str[1] = (int)(p & 0xff);
819 c_str[2] = (int)((p >> 8) & 0xff);
820 c_str[3] = (int)((p >> 16) & 0xff);
821 c_str[4] = (int)((p >> 24) & 0xff);
822 len = 5;
823 }
824 else {
825 c_str[0] = BINPUT;
826 c_str[1] = p;
827 len = 2;
828 }
829 }
830
Tim Peters0bc93f52003-02-02 18:29:33 +0000831 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000832 goto finally;
833
834 res = 0;
835
836 finally:
837 Py_XDECREF(py_ob_id);
838 Py_XDECREF(memo_len);
839 Py_XDECREF(t);
840
841 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000842}
843
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000844static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000845whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000846{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000847 Py_ssize_t i, j;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000848 PyObject *module = 0, *modules_dict = 0,
849 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000851 module = PyObject_GetAttrString(global, "__module__");
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000852 if (module)
853 return module;
854 if (PyErr_ExceptionMatches(PyExc_AttributeError))
855 PyErr_Clear();
856 else
857 return NULL;
Guido van Rossum45188231997-09-28 05:38:51 +0000858
Tim Peterscba30e22003-02-01 06:24:36 +0000859 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000860 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000862 i = 0;
863 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000865 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000867 global_name_attr = PyObject_GetAttr(module, global_name);
868 if (!global_name_attr) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000869 if (PyErr_ExceptionMatches(PyExc_AttributeError))
870 PyErr_Clear();
871 else
872 return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000873 continue;
874 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000876 if (global_name_attr != global) {
877 Py_DECREF(global_name_attr);
878 continue;
879 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000880
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000881 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000883 break;
884 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000886 /* The following implements the rule in pickle.py added in 1.5
887 that used __main__ if no module is found. I don't actually
888 like this rule. jlf
889 */
890 if (!j) {
891 j=1;
892 name=__main___str;
893 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000895 Py_INCREF(name);
896 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000897}
898
899
Guido van Rossum60456fd1997-04-09 17:36:32 +0000900static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000901fast_save_enter(Picklerobject *self, PyObject *obj)
902{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000903 /* if fast_container < 0, we're doing an error exit. */
904 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
905 PyObject *key = NULL;
906 if (self->fast_memo == NULL) {
907 self->fast_memo = PyDict_New();
908 if (self->fast_memo == NULL) {
909 self->fast_container = -1;
910 return 0;
911 }
912 }
913 key = PyLong_FromVoidPtr(obj);
914 if (key == NULL)
915 return 0;
916 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000917 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000918 PyErr_Format(PyExc_ValueError,
Tim Peters92c8bb32003-02-13 23:00:26 +0000919 "fast mode: can't pickle cyclic objects "
920 "including object type %s at %p",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000921 obj->ob_type->tp_name, obj);
922 self->fast_container = -1;
923 return 0;
924 }
925 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000926 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000927 self->fast_container = -1;
928 return 0;
929 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000930 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000931 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000932 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000933}
934
Tim Peterscba30e22003-02-01 06:24:36 +0000935int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000936fast_save_leave(Picklerobject *self, PyObject *obj)
937{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000938 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
939 PyObject *key = PyLong_FromVoidPtr(obj);
940 if (key == NULL)
941 return 0;
942 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000943 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000944 return 0;
945 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000946 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000947 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000948 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000949}
950
951static int
Tim Peterscba30e22003-02-01 06:24:36 +0000952save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000953{
954 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000955 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000956 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000958 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000959}
960
Guido van Rossum77f6a652002-04-03 22:41:51 +0000961static int
Tim Peterscba30e22003-02-01 06:24:36 +0000962save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000963{
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000964 static const char *buf[2] = {FALSE, TRUE};
Guido van Rossume2763392002-04-05 19:30:08 +0000965 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossumddefaf32007-01-14 03:31:43 +0000966 long l = args == Py_True;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000967
Tim Peters3c67d792003-02-02 17:59:11 +0000968 if (self->proto >= 2) {
969 char opcode = l ? NEWTRUE : NEWFALSE;
970 if (self->write_func(self, &opcode, 1) < 0)
971 return -1;
972 }
973 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000974 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000975 return 0;
976}
Tim Peters84e87f32001-03-17 04:50:51 +0000977
Guido van Rossum60456fd1997-04-09 17:36:32 +0000978static int
Guido van Rossumddefaf32007-01-14 03:31:43 +0000979save_int(Picklerobject *self, long l)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000980{
981 char c_str[32];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000982 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000983
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000984 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000985#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000986 || l > 0x7fffffffL
987 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000988#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000989 ) {
990 /* Text-mode pickle, or long too big to fit in the 4-byte
991 * signed BININT format: store as a string.
992 */
993 c_str[0] = INT;
994 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +0000995 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000996 return -1;
997 }
998 else {
999 /* Binary pickle and l fits in a signed 4-byte int. */
1000 c_str[1] = (int)( l & 0xff);
1001 c_str[2] = (int)((l >> 8) & 0xff);
1002 c_str[3] = (int)((l >> 16) & 0xff);
1003 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001004
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001005 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1006 if (c_str[2] == 0) {
1007 c_str[0] = BININT1;
1008 len = 2;
1009 }
1010 else {
1011 c_str[0] = BININT2;
1012 len = 3;
1013 }
1014 }
1015 else {
1016 c_str[0] = BININT;
1017 len = 5;
1018 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001019
Tim Peters0bc93f52003-02-02 18:29:33 +00001020 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001021 return -1;
1022 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001024 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001025}
1026
1027
1028static int
Tim Peterscba30e22003-02-01 06:24:36 +00001029save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001030{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001031 Py_ssize_t size;
Tim Petersee1a53c2003-02-02 02:57:53 +00001032 int res = -1;
1033 PyObject *repr = NULL;
Guido van Rossumddefaf32007-01-14 03:31:43 +00001034 int val = PyInt_AsLong(args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001035 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001036
Guido van Rossumddefaf32007-01-14 03:31:43 +00001037 if (val == -1 && PyErr_Occurred()) {
1038 /* out of range for int pickling */
1039 PyErr_Clear();
1040 }
1041 else
1042 return save_int(self, val);
1043
Tim Petersee1a53c2003-02-02 02:57:53 +00001044 if (self->proto >= 2) {
1045 /* Linear-time pickling. */
1046 size_t nbits;
1047 size_t nbytes;
1048 unsigned char *pdata;
1049 char c_str[5];
1050 int i;
1051 int sign = _PyLong_Sign(args);
1052
1053 if (sign == 0) {
1054 /* It's 0 -- an empty bytestring. */
1055 c_str[0] = LONG1;
1056 c_str[1] = 0;
1057 i = self->write_func(self, c_str, 2);
1058 if (i < 0) goto finally;
1059 res = 0;
1060 goto finally;
1061 }
1062 nbits = _PyLong_NumBits(args);
1063 if (nbits == (size_t)-1 && PyErr_Occurred())
1064 goto finally;
1065 /* How many bytes do we need? There are nbits >> 3 full
1066 * bytes of data, and nbits & 7 leftover bits. If there
1067 * are any leftover bits, then we clearly need another
1068 * byte. Wnat's not so obvious is that we *probably*
1069 * need another byte even if there aren't any leftovers:
1070 * the most-significant bit of the most-significant byte
1071 * acts like a sign bit, and it's usually got a sense
1072 * opposite of the one we need. The exception is longs
1073 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1074 * its own 256's-complement, so has the right sign bit
1075 * even without the extra byte. That's a pain to check
1076 * for in advance, though, so we always grab an extra
1077 * byte at the start, and cut it back later if possible.
1078 */
1079 nbytes = (nbits >> 3) + 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001080 if (nbytes > INT_MAX) {
Tim Petersee1a53c2003-02-02 02:57:53 +00001081 PyErr_SetString(PyExc_OverflowError, "long too large "
1082 "to pickle");
1083 goto finally;
1084 }
1085 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
1086 if (repr == NULL) goto finally;
1087 pdata = (unsigned char *)PyString_AS_STRING(repr);
1088 i = _PyLong_AsByteArray((PyLongObject *)args,
1089 pdata, nbytes,
1090 1 /* little endian */, 1 /* signed */);
1091 if (i < 0) goto finally;
1092 /* If the long is negative, this may be a byte more than
1093 * needed. This is so iff the MSB is all redundant sign
1094 * bits.
1095 */
1096 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1097 (pdata[nbytes - 2] & 0x80) != 0)
1098 --nbytes;
1099
1100 if (nbytes < 256) {
1101 c_str[0] = LONG1;
1102 c_str[1] = (char)nbytes;
1103 size = 2;
1104 }
1105 else {
1106 c_str[0] = LONG4;
1107 size = (int)nbytes;
1108 for (i = 1; i < 5; i++) {
1109 c_str[i] = (char)(size & 0xff);
1110 size >>= 8;
1111 }
1112 size = 5;
1113 }
1114 i = self->write_func(self, c_str, size);
1115 if (i < 0) goto finally;
1116 i = self->write_func(self, (char *)pdata, (int)nbytes);
1117 if (i < 0) goto finally;
1118 res = 0;
1119 goto finally;
1120 }
1121
1122 /* proto < 2: write the repr and newline. This is quadratic-time
1123 * (in the number of digits), in both directions.
1124 */
Tim Peterscba30e22003-02-01 06:24:36 +00001125 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001126 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001128 if ((size = PyString_Size(repr)) < 0)
1129 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001130
Tim Peters0bc93f52003-02-02 18:29:33 +00001131 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001132 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001133
Tim Peters0bc93f52003-02-02 18:29:33 +00001134 if (self->write_func(self,
1135 PyString_AS_STRING((PyStringObject *)repr),
1136 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001137 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001138
Tim Peters0bc93f52003-02-02 18:29:33 +00001139 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001140 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001142 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001144 finally:
1145 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001146 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001147}
1148
1149
1150static int
Tim Peterscba30e22003-02-01 06:24:36 +00001151save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001152{
1153 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001155 if (self->bin) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001156 char str[9];
Tim Peters9905b942003-03-20 20:53:32 +00001157 str[0] = BINFLOAT;
1158 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001159 return -1;
Tim Peters0bc93f52003-02-02 18:29:33 +00001160 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001161 return -1;
1162 }
1163 else {
1164 char c_str[250];
1165 c_str[0] = FLOAT;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001166 PyOS_ascii_formatd(c_str + 1, sizeof(c_str) - 2, "%.17g", x);
1167 /* Extend the formatted string with a newline character */
1168 strcat(c_str, "\n");
Guido van Rossum60456fd1997-04-09 17:36:32 +00001169
Tim Peters0bc93f52003-02-02 18:29:33 +00001170 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001171 return -1;
1172 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001173
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001174 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001175}
1176
1177
1178static int
Tim Peterscba30e22003-02-01 06:24:36 +00001179save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001180{
1181 int size, len;
1182 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001184 if ((size = PyString_Size(args)) < 0)
1185 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001186
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001187 if (!self->bin) {
1188 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001190 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001191
Tim Peterscba30e22003-02-01 06:24:36 +00001192 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001193 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001195 if ((len = PyString_Size(repr)) < 0)
1196 goto err;
1197 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001198
Tim Peters0bc93f52003-02-02 18:29:33 +00001199 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001200 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001201
Tim Peters0bc93f52003-02-02 18:29:33 +00001202 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001203 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001204
Tim Peters0bc93f52003-02-02 18:29:33 +00001205 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001206 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001208 Py_XDECREF(repr);
1209 }
1210 else {
1211 int i;
1212 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001214 if ((size = PyString_Size(args)) < 0)
1215 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001217 if (size < 256) {
1218 c_str[0] = SHORT_BINSTRING;
1219 c_str[1] = size;
1220 len = 2;
1221 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001222 else if (size <= INT_MAX) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001223 c_str[0] = BINSTRING;
1224 for (i = 1; i < 5; i++)
1225 c_str[i] = (int)(size >> ((i - 1) * 8));
1226 len = 5;
1227 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001228 else
1229 return -1; /* string too large */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001230
Tim Peters0bc93f52003-02-02 18:29:33 +00001231 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001232 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001234 if (size > 128 && Pdata_Check(self->file)) {
1235 if (write_other(self, NULL, 0) < 0) return -1;
1236 PDATA_APPEND(self->file, args, -1);
1237 }
1238 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001239 if (self->write_func(self,
1240 PyString_AS_STRING(
1241 (PyStringObject *)args),
1242 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001243 return -1;
1244 }
1245 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001247 if (doput)
1248 if (put(self, args) < 0)
1249 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001250
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001251 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001252
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001253 err:
1254 Py_XDECREF(repr);
1255 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001256}
1257
1258
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001259/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1260 backslash and newline characters to \uXXXX escapes. */
1261static PyObject *
1262modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1263{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001264 PyObject *repr;
1265 char *p;
1266 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001268 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001269
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001270 repr = PyString_FromStringAndSize(NULL, 6 * size);
1271 if (repr == NULL)
1272 return NULL;
1273 if (size == 0)
1274 return repr;
1275
1276 p = q = PyString_AS_STRING(repr);
1277 while (size-- > 0) {
1278 Py_UNICODE ch = *s++;
1279 /* Map 16-bit characters to '\uxxxx' */
1280 if (ch >= 256 || ch == '\\' || ch == '\n') {
1281 *p++ = '\\';
1282 *p++ = 'u';
1283 *p++ = hexdigit[(ch >> 12) & 0xf];
1284 *p++ = hexdigit[(ch >> 8) & 0xf];
1285 *p++ = hexdigit[(ch >> 4) & 0xf];
1286 *p++ = hexdigit[ch & 15];
1287 }
1288 /* Copy everything else as-is */
1289 else
1290 *p++ = (char) ch;
1291 }
1292 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001293 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001294 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001295}
1296
1297
Guido van Rossum60456fd1997-04-09 17:36:32 +00001298static int
Tim Peterscba30e22003-02-01 06:24:36 +00001299save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001300{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001301 Py_ssize_t size, len;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001302 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001304 if (!PyUnicode_Check(args))
1305 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001306
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001307 if (!self->bin) {
1308 char *repr_str;
1309 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001311 repr = modified_EncodeRawUnicodeEscape(
1312 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001313 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001314 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001315
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001316 if ((len = PyString_Size(repr)) < 0)
1317 goto err;
1318 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001319
Tim Peters0bc93f52003-02-02 18:29:33 +00001320 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001321 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001322
Tim Peters0bc93f52003-02-02 18:29:33 +00001323 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001324 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001325
Tim Peters0bc93f52003-02-02 18:29:33 +00001326 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001327 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001328
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001329 Py_XDECREF(repr);
1330 }
1331 else {
1332 int i;
1333 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001334
Tim Peterscba30e22003-02-01 06:24:36 +00001335 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001336 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001337
Guido van Rossum617dbc42007-05-07 23:57:08 +00001338 assert(PyBytes_Check(repr));
1339 if ((size = PyBytes_Size(repr)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001340 goto err;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001341 if (size > INT_MAX)
1342 return -1; /* string too large */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001344 c_str[0] = BINUNICODE;
1345 for (i = 1; i < 5; i++)
1346 c_str[i] = (int)(size >> ((i - 1) * 8));
1347 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001348
Tim Peters0bc93f52003-02-02 18:29:33 +00001349 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001350 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001351
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001352 if (size > 128 && Pdata_Check(self->file)) {
1353 if (write_other(self, NULL, 0) < 0)
1354 goto err;
1355 PDATA_APPEND(self->file, repr, -1);
1356 }
1357 else {
Guido van Rossum617dbc42007-05-07 23:57:08 +00001358 if (self->write_func(self, PyBytes_AS_STRING(repr),
Tim Peters0bc93f52003-02-02 18:29:33 +00001359 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001360 goto err;
1361 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001362
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001363 Py_DECREF(repr);
1364 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001365
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001366 if (doput)
1367 if (put(self, args) < 0)
1368 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001369
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001370 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001372 err:
1373 Py_XDECREF(repr);
1374 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001375}
1376
Tim Peters1d63c9f2003-02-02 20:29:39 +00001377/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1378static int
Tim Peters67920142003-02-05 03:46:17 +00001379store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001380{
1381 int i;
1382 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001383
Tim Peters1d63c9f2003-02-02 20:29:39 +00001384 assert(PyTuple_Size(t) == len);
1385
1386 for (i = 0; i < len; i++) {
1387 PyObject *element = PyTuple_GET_ITEM(t, i);
1388
1389 if (element == NULL)
1390 goto finally;
1391 if (save(self, element, 0) < 0)
1392 goto finally;
1393 }
1394 res = 0;
1395
1396 finally:
1397 return res;
1398}
1399
1400/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1401 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001402 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001403 * (a tuple can be reached from itself), and that requires some subtle
1404 * magic so that it works in all cases. IOW, this is a long routine.
1405 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001406static int
Tim Peterscba30e22003-02-01 06:24:36 +00001407save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001408{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001409 PyObject *py_tuple_id = NULL;
1410 int len, i;
1411 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001413 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001414 static char pop = POP;
1415 static char pop_mark = POP_MARK;
1416 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001417
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001418 if ((len = PyTuple_Size(args)) < 0)
1419 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001420
Tim Peters1d63c9f2003-02-02 20:29:39 +00001421 if (len == 0) {
1422 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001423
Tim Peters1d63c9f2003-02-02 20:29:39 +00001424 if (self->proto) {
1425 c_str[0] = EMPTY_TUPLE;
1426 len = 1;
1427 }
1428 else {
1429 c_str[0] = MARK;
1430 c_str[1] = TUPLE;
1431 len = 2;
1432 }
1433 if (self->write_func(self, c_str, len) >= 0)
1434 res = 0;
1435 /* Don't memoize an empty tuple. */
1436 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001437 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001438
Tim Peters1d63c9f2003-02-02 20:29:39 +00001439 /* A non-empty tuple. */
1440
1441 /* id(tuple) isn't in the memo now. If it shows up there after
1442 * saving the tuple elements, the tuple must be recursive, in
1443 * which case we'll pop everything we put on the stack, and fetch
1444 * its value from the memo.
1445 */
1446 py_tuple_id = PyLong_FromVoidPtr(args);
1447 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001448 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001449
Tim Peters1d63c9f2003-02-02 20:29:39 +00001450 if (len <= 3 && self->proto >= 2) {
1451 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001452 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001453 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001454 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001455 /* pop the len elements */
1456 for (i = 0; i < len; ++i)
1457 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001458 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001459 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001460 if (get(self, py_tuple_id) < 0)
1461 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001462 res = 0;
1463 goto finally;
1464 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001465 /* Not recursive. */
1466 if (self->write_func(self, len2opcode + len, 1) < 0)
1467 goto finally;
1468 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001469 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001470
Tim Peters1d63c9f2003-02-02 20:29:39 +00001471 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1472 * Generate MARK elt1 elt2 ... TUPLE
1473 */
1474 if (self->write_func(self, &MARKv, 1) < 0)
1475 goto finally;
1476
Tim Peters67920142003-02-05 03:46:17 +00001477 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001478 goto finally;
1479
1480 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1481 /* pop the stack stuff we pushed */
1482 if (self->bin) {
1483 if (self->write_func(self, &pop_mark, 1) < 0)
1484 goto finally;
1485 }
1486 else {
1487 /* Note that we pop one more than len, to remove
1488 * the MARK too.
1489 */
1490 for (i = 0; i <= len; i++)
1491 if (self->write_func(self, &pop, 1) < 0)
1492 goto finally;
1493 }
1494 /* fetch from memo */
1495 if (get(self, py_tuple_id) >= 0)
1496 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001497 goto finally;
1498 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001499
Tim Peters1d63c9f2003-02-02 20:29:39 +00001500 /* Not recursive. */
1501 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001502 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001503
Tim Peters1d63c9f2003-02-02 20:29:39 +00001504 memoize:
1505 if (put(self, args) >= 0)
1506 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001508 finally:
1509 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001510 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001511}
1512
Tim Peters1092d642003-02-11 21:06:20 +00001513/* iter is an iterator giving items, and we batch up chunks of
1514 * MARK item item ... item APPENDS
1515 * opcode sequences. Calling code should have arranged to first create an
1516 * empty list, or list-like object, for the APPENDS to operate on.
1517 * Returns 0 on success, <0 on error.
1518 */
1519static int
1520batch_list(Picklerobject *self, PyObject *iter)
1521{
1522 PyObject *obj;
1523 PyObject *slice[BATCHSIZE];
1524 int i, n;
1525
1526 static char append = APPEND;
1527 static char appends = APPENDS;
1528
1529 assert(iter != NULL);
1530
1531 if (self->proto == 0) {
1532 /* APPENDS isn't available; do one at a time. */
1533 for (;;) {
1534 obj = PyIter_Next(iter);
1535 if (obj == NULL) {
1536 if (PyErr_Occurred())
1537 return -1;
1538 break;
1539 }
1540 i = save(self, obj, 0);
1541 Py_DECREF(obj);
1542 if (i < 0)
1543 return -1;
1544 if (self->write_func(self, &append, 1) < 0)
1545 return -1;
Tim Peters1092d642003-02-11 21:06:20 +00001546 }
1547 return 0;
1548 }
1549
1550 /* proto > 0: write in batches of BATCHSIZE. */
1551 do {
1552 /* Get next group of (no more than) BATCHSIZE elements. */
1553 for (n = 0; n < BATCHSIZE; ++n) {
1554 obj = PyIter_Next(iter);
1555 if (obj == NULL) {
1556 if (PyErr_Occurred())
1557 goto BatchFailed;
1558 break;
1559 }
1560 slice[n] = obj;
1561 }
1562
1563 if (n > 1) {
1564 /* Pump out MARK, slice[0:n], APPENDS. */
1565 if (self->write_func(self, &MARKv, 1) < 0)
1566 goto BatchFailed;
1567 for (i = 0; i < n; ++i) {
1568 if (save(self, slice[i], 0) < 0)
1569 goto BatchFailed;
1570 }
1571 if (self->write_func(self, &appends, 1) < 0)
1572 goto BatchFailed;
1573 }
1574 else if (n == 1) {
1575 if (save(self, slice[0], 0) < 0)
1576 goto BatchFailed;
1577 if (self->write_func(self, &append, 1) < 0)
1578 goto BatchFailed;
1579 }
1580
1581 for (i = 0; i < n; ++i) {
1582 Py_DECREF(slice[i]);
1583 }
Tim Peters90975f12003-02-12 05:28:58 +00001584 } while (n == BATCHSIZE);
Tim Peters1092d642003-02-11 21:06:20 +00001585 return 0;
1586
1587BatchFailed:
1588 while (--n >= 0) {
1589 Py_DECREF(slice[n]);
1590 }
1591 return -1;
1592}
1593
Guido van Rossum60456fd1997-04-09 17:36:32 +00001594static int
Tim Peterscba30e22003-02-01 06:24:36 +00001595save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001596{
Tim Peters1092d642003-02-11 21:06:20 +00001597 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001598 char s[3];
Tim Peters1092d642003-02-11 21:06:20 +00001599 int len;
1600 PyObject *iter;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001602 if (self->fast && !fast_save_enter(self, args))
1603 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001604
Tim Peters1092d642003-02-11 21:06:20 +00001605 /* Create an empty list. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001606 if (self->bin) {
1607 s[0] = EMPTY_LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001608 len = 1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001609 }
1610 else {
1611 s[0] = MARK;
1612 s[1] = LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001613 len = 2;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001614 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001615
Tim Peters1092d642003-02-11 21:06:20 +00001616 if (self->write_func(self, s, len) < 0)
1617 goto finally;
1618
1619 /* Get list length, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001620 if ((len = PyList_Size(args)) < 0)
1621 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001622
Tim Peters1092d642003-02-11 21:06:20 +00001623 /* Memoize. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001624 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001625 if (put(self, args) >= 0)
1626 res = 0;
1627 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001628 }
Tim Peters90975f12003-02-12 05:28:58 +00001629 if (put2(self, args) < 0)
1630 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001631
Tim Peters1092d642003-02-11 21:06:20 +00001632 /* Materialize the list elements. */
1633 iter = PyObject_GetIter(args);
1634 if (iter == NULL)
1635 goto finally;
1636 res = batch_list(self, iter);
1637 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001638
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001639 finally:
1640 if (self->fast && !fast_save_leave(self, args))
1641 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001642
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001643 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001644}
1645
1646
Tim Peters42f08ac2003-02-11 22:43:24 +00001647/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1648 * MARK key value ... key value SETITEMS
1649 * opcode sequences. Calling code should have arranged to first create an
1650 * empty dict, or dict-like object, for the SETITEMS to operate on.
1651 * Returns 0 on success, <0 on error.
1652 *
1653 * This is very much like batch_list(). The difference between saving
1654 * elements directly, and picking apart two-tuples, is so long-winded at
1655 * the C level, though, that attempts to combine these routines were too
1656 * ugly to bear.
1657 */
1658static int
1659batch_dict(Picklerobject *self, PyObject *iter)
1660{
1661 PyObject *p;
1662 PyObject *slice[BATCHSIZE];
1663 int i, n;
1664
1665 static char setitem = SETITEM;
1666 static char setitems = SETITEMS;
1667
1668 assert(iter != NULL);
1669
1670 if (self->proto == 0) {
1671 /* SETITEMS isn't available; do one at a time. */
1672 for (;;) {
1673 p = PyIter_Next(iter);
1674 if (p == NULL) {
1675 if (PyErr_Occurred())
1676 return -1;
1677 break;
1678 }
1679 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1680 PyErr_SetString(PyExc_TypeError, "dict items "
1681 "iterator must return 2-tuples");
1682 return -1;
1683 }
1684 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1685 if (i >= 0)
1686 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1687 Py_DECREF(p);
1688 if (i < 0)
1689 return -1;
1690 if (self->write_func(self, &setitem, 1) < 0)
1691 return -1;
Tim Peters42f08ac2003-02-11 22:43:24 +00001692 }
1693 return 0;
1694 }
1695
1696 /* proto > 0: write in batches of BATCHSIZE. */
1697 do {
1698 /* Get next group of (no more than) BATCHSIZE elements. */
1699 for (n = 0; n < BATCHSIZE; ++n) {
1700 p = PyIter_Next(iter);
1701 if (p == NULL) {
1702 if (PyErr_Occurred())
1703 goto BatchFailed;
1704 break;
1705 }
1706 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1707 PyErr_SetString(PyExc_TypeError, "dict items "
1708 "iterator must return 2-tuples");
1709 goto BatchFailed;
1710 }
1711 slice[n] = p;
1712 }
1713
1714 if (n > 1) {
1715 /* Pump out MARK, slice[0:n], SETITEMS. */
1716 if (self->write_func(self, &MARKv, 1) < 0)
1717 goto BatchFailed;
1718 for (i = 0; i < n; ++i) {
1719 p = slice[i];
1720 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1721 goto BatchFailed;
1722 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1723 goto BatchFailed;
1724 }
1725 if (self->write_func(self, &setitems, 1) < 0)
1726 goto BatchFailed;
1727 }
1728 else if (n == 1) {
1729 p = slice[0];
1730 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1731 goto BatchFailed;
1732 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1733 goto BatchFailed;
1734 if (self->write_func(self, &setitem, 1) < 0)
1735 goto BatchFailed;
1736 }
1737
1738 for (i = 0; i < n; ++i) {
1739 Py_DECREF(slice[i]);
1740 }
Tim Peters90975f12003-02-12 05:28:58 +00001741 } while (n == BATCHSIZE);
Tim Peters42f08ac2003-02-11 22:43:24 +00001742 return 0;
1743
1744BatchFailed:
1745 while (--n >= 0) {
1746 Py_DECREF(slice[n]);
1747 }
1748 return -1;
1749}
1750
Guido van Rossum60456fd1997-04-09 17:36:32 +00001751static int
Tim Peterscba30e22003-02-01 06:24:36 +00001752save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001753{
Tim Peters42f08ac2003-02-11 22:43:24 +00001754 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001755 char s[3];
Tim Peters42f08ac2003-02-11 22:43:24 +00001756 int len;
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001757 PyObject *items, *iter;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001759 if (self->fast && !fast_save_enter(self, args))
1760 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001761
Tim Peters42f08ac2003-02-11 22:43:24 +00001762 /* Create an empty dict. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001763 if (self->bin) {
1764 s[0] = EMPTY_DICT;
1765 len = 1;
1766 }
1767 else {
1768 s[0] = MARK;
1769 s[1] = DICT;
1770 len = 2;
1771 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001772
Tim Peters0bc93f52003-02-02 18:29:33 +00001773 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001774 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001775
Tim Peters42f08ac2003-02-11 22:43:24 +00001776 /* Get dict size, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001777 if ((len = PyDict_Size(args)) < 0)
1778 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001779
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001780 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001781 if (put(self, args) >= 0)
1782 res = 0;
1783 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001784 }
Tim Peters90975f12003-02-12 05:28:58 +00001785 if (put2(self, args) < 0)
1786 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001787
Tim Peters42f08ac2003-02-11 22:43:24 +00001788 /* Materialize the dict items. */
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001789 items = PyObject_CallMethod(args, "items", "()");
1790 if (items == NULL)
1791 goto finally;
1792 iter = PyObject_GetIter(items);
1793 Py_DECREF(items);
Tim Peters42f08ac2003-02-11 22:43:24 +00001794 if (iter == NULL)
1795 goto finally;
1796 res = batch_dict(self, iter);
1797 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001798
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001799 finally:
1800 if (self->fast && !fast_save_leave(self, args))
1801 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001803 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001804}
1805
1806
Guido van Rossum60456fd1997-04-09 17:36:32 +00001807static int
Tim Peterscba30e22003-02-01 06:24:36 +00001808save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001809{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001810 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001811 char *name_str, *module_str;
1812 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001814 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001816 if (name) {
1817 global_name = name;
1818 Py_INCREF(global_name);
1819 }
1820 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001821 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001822 goto finally;
1823 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001824
Tim Peterscba30e22003-02-01 06:24:36 +00001825 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001826 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001828 if ((module_size = PyString_Size(module)) < 0 ||
1829 (name_size = PyString_Size(global_name)) < 0)
1830 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001831
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001832 module_str = PyString_AS_STRING((PyStringObject *)module);
1833 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001834
Guido van Rossum75bfd052002-12-24 18:10:07 +00001835 /* XXX This can be doing a relative import. Clearly it shouldn't,
1836 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001837 mod = PyImport_ImportModule(module_str);
1838 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001839 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001840 "Can't pickle %s: import of module %s "
1841 "failed",
1842 "OS", args, module);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001843 goto finally;
1844 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001845 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001846 if (klass == NULL) {
1847 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001848 "Can't pickle %s: attribute lookup %s.%s "
1849 "failed",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001850 "OSS", args, module, global_name);
1851 goto finally;
1852 }
1853 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001854 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001855 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00001856 "Can't pickle %s: it's not the same object "
1857 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001858 "OSS", args, module, global_name);
1859 goto finally;
1860 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001861 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001862
Tim Peters731098b2003-02-04 20:56:09 +00001863 if (self->proto >= 2) {
1864 /* See whether this is in the extension registry, and if
1865 * so generate an EXT opcode.
1866 */
1867 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00001868 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00001869 char c_str[5];
1870 int n;
1871
1872 PyTuple_SET_ITEM(two_tuple, 0, module);
1873 PyTuple_SET_ITEM(two_tuple, 1, global_name);
1874 py_code = PyDict_GetItem(extension_registry, two_tuple);
1875 if (py_code == NULL)
1876 goto gen_global; /* not registered */
1877
1878 /* Verify py_code has the right type and value. */
1879 if (!PyInt_Check(py_code)) {
1880 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00001881 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00001882 "OO", args, py_code);
1883 goto finally;
1884 }
1885 code = PyInt_AS_LONG(py_code);
1886 if (code <= 0 || code > 0x7fffffffL) {
1887 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
1888 "extension code %ld is out of range",
1889 "Ol", args, code);
1890 goto finally;
1891 }
1892
1893 /* Generate an EXT opcode. */
1894 if (code <= 0xff) {
1895 c_str[0] = EXT1;
1896 c_str[1] = (char)code;
1897 n = 2;
1898 }
1899 else if (code <= 0xffff) {
1900 c_str[0] = EXT2;
1901 c_str[1] = (char)(code & 0xff);
1902 c_str[2] = (char)((code >> 8) & 0xff);
1903 n = 3;
1904 }
1905 else {
1906 c_str[0] = EXT4;
1907 c_str[1] = (char)(code & 0xff);
1908 c_str[2] = (char)((code >> 8) & 0xff);
1909 c_str[3] = (char)((code >> 16) & 0xff);
1910 c_str[4] = (char)((code >> 24) & 0xff);
1911 n = 5;
1912 }
1913
1914 if (self->write_func(self, c_str, n) >= 0)
1915 res = 0;
1916 goto finally; /* and don't memoize */
1917 }
1918
1919 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00001920 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001921 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001922
Tim Peters0bc93f52003-02-02 18:29:33 +00001923 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001924 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001925
Tim Peters0bc93f52003-02-02 18:29:33 +00001926 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001927 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001928
Tim Peters0bc93f52003-02-02 18:29:33 +00001929 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001930 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001931
Tim Peters0bc93f52003-02-02 18:29:33 +00001932 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001933 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001935 if (put(self, args) < 0)
1936 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001938 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001939
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001940 finally:
1941 Py_XDECREF(module);
1942 Py_XDECREF(global_name);
1943 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001945 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001946}
1947
Guido van Rossum60456fd1997-04-09 17:36:32 +00001948static int
Tim Peterscba30e22003-02-01 06:24:36 +00001949save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001950{
1951 PyObject *pid = 0;
1952 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001953
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001954 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001955
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001956 Py_INCREF(args);
1957 ARG_TUP(self, args);
1958 if (self->arg) {
1959 pid = PyObject_Call(f, self->arg, NULL);
1960 FREE_ARG_TUP(self);
1961 }
1962 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001964 if (pid != Py_None) {
1965 if (!self->bin) {
1966 if (!PyString_Check(pid)) {
1967 PyErr_SetString(PicklingError,
1968 "persistent id must be string");
1969 goto finally;
1970 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001971
Tim Peters0bc93f52003-02-02 18:29:33 +00001972 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001973 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001974
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001975 if ((size = PyString_Size(pid)) < 0)
1976 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001977
Tim Peters0bc93f52003-02-02 18:29:33 +00001978 if (self->write_func(self,
1979 PyString_AS_STRING(
1980 (PyStringObject *)pid),
1981 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001982 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001983
Tim Peters0bc93f52003-02-02 18:29:33 +00001984 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001985 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001986
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001987 res = 1;
1988 goto finally;
1989 }
1990 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001991 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001992 res = -1;
1993 else
1994 res = 1;
1995 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001996
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001997 goto finally;
1998 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001999
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002000 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002001
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002002 finally:
2003 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002004
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002005 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002006}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002007
Tim Peters71fcda52003-02-14 23:05:28 +00002008/* We're saving ob, and args is the 2-thru-5 tuple returned by the
2009 * appropriate __reduce__ method for ob.
2010 */
Tim Peters84e87f32001-03-17 04:50:51 +00002011static int
Tim Peters71fcda52003-02-14 23:05:28 +00002012save_reduce(Picklerobject *self, PyObject *args, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002013{
Tim Peters71fcda52003-02-14 23:05:28 +00002014 PyObject *callable;
2015 PyObject *argtup;
2016 PyObject *state = NULL;
2017 PyObject *listitems = NULL;
2018 PyObject *dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002019
Tim Peters71fcda52003-02-14 23:05:28 +00002020 int use_newobj = self->proto >= 2;
2021
2022 static char reduce = REDUCE;
2023 static char build = BUILD;
2024 static char newobj = NEWOBJ;
2025
2026 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
2027 &callable,
2028 &argtup,
2029 &state,
2030 &listitems,
2031 &dictitems))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002032 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002033
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002034 if (!PyTuple_Check(argtup)) {
2035 PyErr_SetString(PicklingError,
2036 "args from reduce() should be a tuple");
2037 return -1;
2038 }
2039
Tim Peters71fcda52003-02-14 23:05:28 +00002040 if (state == Py_None)
2041 state = NULL;
2042 if (listitems == Py_None)
2043 listitems = NULL;
2044 if (dictitems == Py_None)
2045 dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002046
Tim Peters71fcda52003-02-14 23:05:28 +00002047 /* Protocol 2 special case: if callable's name is __newobj__, use
2048 * NEWOBJ. This consumes a lot of code.
2049 */
2050 if (use_newobj) {
2051 PyObject *temp = PyObject_GetAttr(callable, __name___str);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002052
Tim Peters71fcda52003-02-14 23:05:28 +00002053 if (temp == NULL) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002054 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2055 PyErr_Clear();
2056 else
2057 return -1;
Tim Peters71fcda52003-02-14 23:05:28 +00002058 use_newobj = 0;
2059 }
2060 else {
2061 use_newobj = PyString_Check(temp) &&
2062 strcmp(PyString_AS_STRING(temp),
2063 "__newobj__") == 0;
2064 Py_DECREF(temp);
2065 }
2066 }
2067 if (use_newobj) {
2068 PyObject *cls;
2069 PyObject *newargtup;
2070 int n, i;
2071
2072 /* Sanity checks. */
2073 n = PyTuple_Size(argtup);
2074 if (n < 1) {
2075 PyErr_SetString(PicklingError, "__newobj__ arglist "
2076 "is empty");
2077 return -1;
2078 }
2079
2080 cls = PyTuple_GET_ITEM(argtup, 0);
2081 if (! PyObject_HasAttrString(cls, "__new__")) {
2082 PyErr_SetString(PicklingError, "args[0] from "
2083 "__newobj__ args has no __new__");
2084 return -1;
2085 }
2086
2087 /* XXX How could ob be NULL? */
2088 if (ob != NULL) {
2089 PyObject *ob_dot_class;
2090
2091 ob_dot_class = PyObject_GetAttr(ob, __class___str);
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002092 if (ob_dot_class == NULL) {
2093 if (PyErr_ExceptionMatches(
2094 PyExc_AttributeError))
2095 PyErr_Clear();
2096 else
2097 return -1;
2098 }
Tim Peters71fcda52003-02-14 23:05:28 +00002099 i = ob_dot_class != cls; /* true iff a problem */
2100 Py_XDECREF(ob_dot_class);
2101 if (i) {
2102 PyErr_SetString(PicklingError, "args[0] from "
2103 "__newobj__ args has the wrong class");
2104 return -1;
2105 }
2106 }
2107
2108 /* Save the class and its __new__ arguments. */
2109 if (save(self, cls, 0) < 0)
2110 return -1;
2111
2112 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2113 if (newargtup == NULL)
2114 return -1;
2115 for (i = 1; i < n; ++i) {
2116 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2117 Py_INCREF(temp);
2118 PyTuple_SET_ITEM(newargtup, i-1, temp);
2119 }
2120 i = save(self, newargtup, 0) < 0;
2121 Py_DECREF(newargtup);
2122 if (i < 0)
2123 return -1;
2124
2125 /* Add NEWOBJ opcode. */
2126 if (self->write_func(self, &newobj, 1) < 0)
2127 return -1;
2128 }
2129 else {
2130 /* Not using NEWOBJ. */
2131 if (save(self, callable, 0) < 0 ||
2132 save(self, argtup, 0) < 0 ||
2133 self->write_func(self, &reduce, 1) < 0)
2134 return -1;
2135 }
2136
2137 /* Memoize. */
2138 /* XXX How can ob be NULL? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002139 if (ob != NULL) {
2140 if (state && !PyDict_Check(state)) {
2141 if (put2(self, ob) < 0)
2142 return -1;
2143 }
Tim Peters71fcda52003-02-14 23:05:28 +00002144 else if (put(self, ob) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002145 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002146 }
Tim Peters84e87f32001-03-17 04:50:51 +00002147
Guido van Rossum60456fd1997-04-09 17:36:32 +00002148
Tim Peters71fcda52003-02-14 23:05:28 +00002149 if (listitems && batch_list(self, listitems) < 0)
2150 return -1;
2151
2152 if (dictitems && batch_dict(self, dictitems) < 0)
2153 return -1;
2154
2155 if (state) {
2156 if (save(self, state, 0) < 0 ||
2157 self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002158 return -1;
2159 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002160
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002161 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002162}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002163
Guido van Rossum60456fd1997-04-09 17:36:32 +00002164static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002165save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002166{
2167 PyTypeObject *type;
Tim Peters71fcda52003-02-14 23:05:28 +00002168 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
2169 PyObject *arg_tup;
2170 int res = -1;
2171 int tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002172
Martin v. Löwis5a395302002-08-04 08:20:23 +00002173 if (self->nesting++ > Py_GetRecursionLimit()){
2174 PyErr_SetString(PyExc_RuntimeError,
2175 "maximum recursion depth exceeded");
2176 goto finally;
2177 }
2178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002179 if (!pers_save && self->pers_func) {
2180 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2181 res = tmp;
2182 goto finally;
2183 }
2184 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002185
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002186 if (args == Py_None) {
2187 res = save_none(self, args);
2188 goto finally;
2189 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002190
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002191 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002193 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002194 case 'b':
2195 if (args == Py_False || args == Py_True) {
2196 res = save_bool(self, args);
2197 goto finally;
2198 }
2199 break;
Guido van Rossum52d01782007-01-14 04:02:16 +00002200 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002201 if (type == &PyLong_Type) {
2202 res = save_long(self, args);
2203 goto finally;
2204 }
2205 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002206
Guido van Rossum60456fd1997-04-09 17:36:32 +00002207 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002208 if (type == &PyFloat_Type) {
2209 res = save_float(self, args);
2210 goto finally;
2211 }
2212 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002213
Guido van Rossum60456fd1997-04-09 17:36:32 +00002214 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002215 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2216 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002217 goto finally;
2218 }
2219 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002220
Guido van Rossum32c38e72007-05-07 17:15:57 +00002221 case 's': /* str8, str */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002222 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2223 res = save_string(self, args, 0);
2224 goto finally;
2225 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002226 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2227 res = save_unicode(self, args, 0);
2228 goto finally;
2229 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002230 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002232 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002233 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002234 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002235
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002236 if (PyDict_GetItem(self->memo, py_ob_id)) {
2237 if (get(self, py_ob_id) < 0)
2238 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002239
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002240 res = 0;
2241 goto finally;
2242 }
2243 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002245 switch (type->tp_name[0]) {
Guido van Rossum32c38e72007-05-07 17:15:57 +00002246 case 's': /* str8, str */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002247 if (type == &PyString_Type) {
2248 res = save_string(self, args, 1);
2249 goto finally;
2250 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002251 if (type == &PyUnicode_Type) {
2252 res = save_unicode(self, args, 1);
2253 goto finally;
2254 }
2255 break;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002256
Guido van Rossum60456fd1997-04-09 17:36:32 +00002257 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002258 if (type == &PyTuple_Type) {
2259 res = save_tuple(self, args);
2260 goto finally;
2261 }
2262 if (type == &PyType_Type) {
2263 res = save_global(self, args, NULL);
2264 goto finally;
2265 }
2266 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002267
Guido van Rossum60456fd1997-04-09 17:36:32 +00002268 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002269 if (type == &PyList_Type) {
2270 res = save_list(self, args);
2271 goto finally;
2272 }
2273 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002274
2275 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002276 if (type == &PyDict_Type) {
2277 res = save_dict(self, args);
2278 goto finally;
2279 }
2280 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002281
Guido van Rossum512ab9f2006-08-17 22:28:49 +00002282 case 'i':
2283 break;
2284
2285 case 'c':
2286 break;
2287
Guido van Rossum60456fd1997-04-09 17:36:32 +00002288 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002289 if (type == &PyFunction_Type) {
2290 res = save_global(self, args, NULL);
Christian Tismer2460c622004-02-26 16:21:45 +00002291 if (res && PyErr_ExceptionMatches(PickleError)) {
2292 /* fall back to reduce */
2293 PyErr_Clear();
2294 break;
2295 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002296 goto finally;
2297 }
2298 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002299
2300 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002301 if (type == &PyCFunction_Type) {
2302 res = save_global(self, args, NULL);
2303 goto finally;
2304 }
2305 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002306
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002307 if (!pers_save && self->inst_pers_func) {
2308 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2309 res = tmp;
2310 goto finally;
2311 }
2312 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002313
Jeremy Hylton39c61162002-07-16 19:47:43 +00002314 if (PyType_IsSubtype(type, &PyType_Type)) {
2315 res = save_global(self, args, NULL);
2316 goto finally;
2317 }
2318
Guido van Rossumb289b872003-02-19 01:45:13 +00002319 /* Get a reduction callable, and call it. This may come from
2320 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
2321 * or the object's __reduce__ method.
Tim Peters71fcda52003-02-14 23:05:28 +00002322 */
Tim Peters5aa3da62003-02-13 21:03:57 +00002323 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2324 if (__reduce__ != NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002325 Py_INCREF(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00002326 Py_INCREF(args);
2327 ARG_TUP(self, args);
2328 if (self->arg) {
2329 t = PyObject_Call(__reduce__, self->arg, NULL);
2330 FREE_ARG_TUP(self);
2331 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002332 }
2333 else {
Guido van Rossumb289b872003-02-19 01:45:13 +00002334 /* Check for a __reduce_ex__ method. */
2335 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2336 if (__reduce__ != NULL) {
2337 t = PyInt_FromLong(self->proto);
2338 if (t != NULL) {
2339 ARG_TUP(self, t);
2340 t = NULL;
2341 if (self->arg) {
2342 t = PyObject_Call(__reduce__,
2343 self->arg, NULL);
2344 FREE_ARG_TUP(self);
2345 }
2346 }
2347 }
2348 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002349 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2350 PyErr_Clear();
2351 else
2352 goto finally;
Guido van Rossumb289b872003-02-19 01:45:13 +00002353 /* Check for a __reduce__ method. */
2354 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2355 if (__reduce__ != NULL) {
2356 t = PyObject_Call(__reduce__,
2357 empty_tuple, NULL);
2358 }
2359 else {
2360 PyErr_SetObject(UnpickleableError, args);
2361 goto finally;
2362 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002363 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002364 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002365
Tim Peters71fcda52003-02-14 23:05:28 +00002366 if (t == NULL)
2367 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002368
Tim Peters71fcda52003-02-14 23:05:28 +00002369 if (PyString_Check(t)) {
2370 res = save_global(self, args, t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002371 goto finally;
2372 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002373
Tim Peters71fcda52003-02-14 23:05:28 +00002374 if (! PyTuple_Check(t)) {
2375 cPickle_ErrFormat(PicklingError, "Value returned by "
2376 "%s must be string or tuple",
2377 "O", __reduce__);
2378 goto finally;
2379 }
2380
2381 size = PyTuple_Size(t);
2382 if (size < 2 || size > 5) {
2383 cPickle_ErrFormat(PicklingError, "tuple returned by "
2384 "%s must contain 2 through 5 elements",
2385 "O", __reduce__);
2386 goto finally;
2387 }
2388
2389 arg_tup = PyTuple_GET_ITEM(t, 1);
2390 if (!(PyTuple_Check(arg_tup) || arg_tup == Py_None)) {
2391 cPickle_ErrFormat(PicklingError, "Second element of "
2392 "tuple returned by %s must be a tuple",
2393 "O", __reduce__);
2394 goto finally;
2395 }
2396
2397 res = save_reduce(self, t, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002399 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002400 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002401 Py_XDECREF(py_ob_id);
2402 Py_XDECREF(__reduce__);
2403 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002405 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002406}
2407
2408
2409static int
Tim Peterscba30e22003-02-01 06:24:36 +00002410dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002411{
2412 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002413
Tim Peters4190fb82003-02-02 16:09:05 +00002414 if (self->proto >= 2) {
2415 char bytes[2];
2416
2417 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002418 assert(self->proto >= 0 && self->proto < 256);
2419 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002420 if (self->write_func(self, bytes, 2) < 0)
2421 return -1;
2422 }
2423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002424 if (save(self, args, 0) < 0)
2425 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002426
Tim Peters4190fb82003-02-02 16:09:05 +00002427 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002428 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002429
Tim Peters4190fb82003-02-02 16:09:05 +00002430 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002431 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002433 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002434}
2435
2436static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002437Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002438{
Tim Peterscba30e22003-02-01 06:24:36 +00002439 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002440 PyDict_Clear(self->memo);
2441 Py_INCREF(Py_None);
2442 return Py_None;
2443}
2444
2445static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002446Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002447{
2448 int l, i, rsize, ssize, clear=1, lm;
2449 long ik;
2450 PyObject *k, *r;
2451 char *s, *p, *have_get;
2452 Pdata *data;
2453
2454 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002455 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002456 return NULL;
2457
2458 /* Check to make sure we are based on a list */
2459 if (! Pdata_Check(self->file)) {
2460 PyErr_SetString(PicklingError,
2461 "Attempt to getvalue() a non-list-based pickler");
2462 return NULL;
2463 }
2464
2465 /* flush write buffer */
2466 if (write_other(self, NULL, 0) < 0) return NULL;
2467
2468 data=(Pdata*)self->file;
2469 l=data->length;
2470
2471 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002472 lm = PyDict_Size(self->memo);
2473 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002474 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002475 have_get = malloc(lm);
2476 if (have_get == NULL) return PyErr_NoMemory();
2477 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002478
2479 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002480 for (rsize = 0, i = l; --i >= 0; ) {
2481 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002482
Tim Petersac5687a2003-02-02 18:08:34 +00002483 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002484 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002485
2486 else if (PyInt_Check(k)) { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002487 ik = PyInt_AsLong(k);
2488 if (ik == -1 && PyErr_Occurred())
2489 goto err;
Tim Petersac5687a2003-02-02 18:08:34 +00002490 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002491 PyErr_SetString(PicklingError,
2492 "Invalid get data");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002493 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002494 }
Tim Petersac5687a2003-02-02 18:08:34 +00002495 if (have_get[ik]) /* with matching get */
2496 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002497 }
2498
2499 else if (! (PyTuple_Check(k) &&
2500 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002501 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002502 ) {
2503 PyErr_SetString(PicklingError,
2504 "Unexpected data in internal list");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002505 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002506 }
2507
2508 else { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002509 ik = PyInt_AsLong(k);
2510 if (ik == -1 && PyErr_Occurred())
2511 goto err;
Tim Petersac5687a2003-02-02 18:08:34 +00002512 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002513 PyErr_SetString(PicklingError,
2514 "Invalid get data");
2515 return NULL;
2516 }
Tim Petersac5687a2003-02-02 18:08:34 +00002517 have_get[ik] = 1;
2518 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002519 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002520 }
2521
2522 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002523 r = PyString_FromStringAndSize(NULL, rsize);
2524 if (r == NULL) goto err;
2525 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002526
Tim Petersac5687a2003-02-02 18:08:34 +00002527 for (i = 0; i < l; i++) {
2528 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002529
2530 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002531 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002532 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002533 p=PyString_AS_STRING((PyStringObject *)k);
2534 while (--ssize >= 0)
2535 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002536 }
2537 }
2538
2539 else if (PyTuple_Check(k)) { /* get */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002540 ik = PyLong_AsLong(PyTuple_GET_ITEM(k, 0));
2541 if (ik == -1 && PyErr_Occurred())
2542 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002543 if (ik < 256) {
2544 *s++ = BINGET;
2545 *s++ = (int)(ik & 0xff);
2546 }
2547 else {
2548 *s++ = LONG_BINGET;
2549 *s++ = (int)(ik & 0xff);
2550 *s++ = (int)((ik >> 8) & 0xff);
2551 *s++ = (int)((ik >> 16) & 0xff);
2552 *s++ = (int)((ik >> 24) & 0xff);
2553 }
2554 }
2555
2556 else { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002557 ik = PyLong_AsLong(k);
2558 if (ik == -1 && PyErr_Occurred())
2559 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002560
2561 if (have_get[ik]) { /* with matching get */
2562 if (ik < 256) {
2563 *s++ = BINPUT;
2564 *s++ = (int)(ik & 0xff);
2565 }
2566 else {
2567 *s++ = LONG_BINPUT;
2568 *s++ = (int)(ik & 0xff);
2569 *s++ = (int)((ik >> 8) & 0xff);
2570 *s++ = (int)((ik >> 16) & 0xff);
2571 *s++ = (int)((ik >> 24) & 0xff);
2572 }
2573 }
2574 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002575 }
2576
2577 if (clear) {
2578 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002579 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002580 }
2581
2582 free(have_get);
2583 return r;
2584 err:
2585 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002586 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002587}
2588
2589static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002590Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002591{
2592 PyObject *ob;
2593 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002594
Tim Peterscba30e22003-02-01 06:24:36 +00002595 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002596 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002598 if (dump(self, ob) < 0)
2599 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002600
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002601 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002603 /* XXX Why does dump() return self? */
2604 Py_INCREF(self);
2605 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002606}
2607
2608
Tim Peterscba30e22003-02-01 06:24:36 +00002609static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002610{
Neal Norwitzb0493252002-03-31 14:44:22 +00002611 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002612 PyDoc_STR("dump(object) -- "
2613 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002614 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002615 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002616 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002617 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002618 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002619};
2620
2621
2622static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002623newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002624{
2625 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002626
Tim Peters5bd2a792003-02-01 16:45:06 +00002627 if (proto < 0)
Tim Peters8587b3c2003-02-13 15:44:41 +00002628 proto = HIGHEST_PROTOCOL;
2629 if (proto > HIGHEST_PROTOCOL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002630 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2631 "the highest available protocol is %d",
Tim Peters8587b3c2003-02-13 15:44:41 +00002632 proto, HIGHEST_PROTOCOL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002633 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002634 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002635
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002636 self = PyObject_GC_New(Picklerobject, &Picklertype);
Tim Peters5bd2a792003-02-01 16:45:06 +00002637 if (self == NULL)
2638 return NULL;
2639 self->proto = proto;
2640 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002641 self->fp = NULL;
2642 self->write = NULL;
2643 self->memo = NULL;
2644 self->arg = NULL;
2645 self->pers_func = NULL;
2646 self->inst_pers_func = NULL;
2647 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002648 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002649 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002650 self->fast_container = 0;
2651 self->fast_memo = NULL;
2652 self->buf_size = 0;
2653 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002654
Tim Peters5bd2a792003-02-01 16:45:06 +00002655 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002656 if (file)
2657 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002658 else {
2659 file = Pdata_New();
2660 if (file == NULL)
2661 goto err;
2662 }
2663 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002664
Tim Peterscba30e22003-02-01 06:24:36 +00002665 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002666 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002668 if (PyFile_Check(file)) {
2669 self->fp = PyFile_AsFile(file);
2670 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002671 PyErr_SetString(PyExc_ValueError,
2672 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002673 goto err;
2674 }
2675 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002676 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002677 else if (PycStringIO_OutputCheck(file)) {
2678 self->write_func = write_cStringIO;
2679 }
2680 else if (file == Py_None) {
2681 self->write_func = write_none;
2682 }
2683 else {
2684 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002685
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002686 if (! Pdata_Check(file)) {
2687 self->write = PyObject_GetAttr(file, write_str);
2688 if (!self->write) {
2689 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002690 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002691 "argument must have 'write' "
2692 "attribute");
2693 goto err;
2694 }
2695 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002696
Tim Peters5bd2a792003-02-01 16:45:06 +00002697 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2698 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002699 PyErr_NoMemory();
2700 goto err;
2701 }
2702 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002703
Guido van Rossuma8add0e2007-05-14 22:03:55 +00002704 self->dispatch_table = dispatch_table;
2705 Py_INCREF(dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002706 PyObject_GC_Track(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002708 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002710 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002711 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002712 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002713}
2714
2715
2716static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00002717get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002718{
Martin v. Löwis15e62742006-02-27 16:46:16 +00002719 static char *kwlist[] = {"file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002720 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002721 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002722
Tim Peters92c8bb32003-02-13 23:00:26 +00002723 /* XXX
Martin v. Löwis544f1192004-07-27 05:22:33 +00002724 * The documented signature is Pickler(file, protocol=0), but this
Tim Peters92c8bb32003-02-13 23:00:26 +00002725 * accepts Pickler() and Pickler(integer) too. The meaning then
2726 * is clear as mud, undocumented, and not supported by pickle.py.
2727 * I'm told Zope uses this, but I haven't traced into this code
2728 * far enough to figure out what it means.
Tim Peters5bd2a792003-02-01 16:45:06 +00002729 */
2730 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002731 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002732 proto = 0;
Martin v. Löwis544f1192004-07-27 05:22:33 +00002733 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
2734 kwlist, &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002735 return NULL;
2736 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002737 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002738}
2739
2740
2741static void
Tim Peterscba30e22003-02-01 06:24:36 +00002742Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002743{
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002744 PyObject_GC_UnTrack(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002745 Py_XDECREF(self->write);
2746 Py_XDECREF(self->memo);
2747 Py_XDECREF(self->fast_memo);
2748 Py_XDECREF(self->arg);
2749 Py_XDECREF(self->file);
2750 Py_XDECREF(self->pers_func);
2751 Py_XDECREF(self->inst_pers_func);
2752 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002753 PyMem_Free(self->write_buf);
Tim Peters3cfe7542003-05-21 21:29:48 +00002754 self->ob_type->tp_free((PyObject *)self);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002755}
2756
2757static int
2758Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
2759{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002760 Py_VISIT(self->write);
2761 Py_VISIT(self->memo);
2762 Py_VISIT(self->fast_memo);
2763 Py_VISIT(self->arg);
2764 Py_VISIT(self->file);
2765 Py_VISIT(self->pers_func);
2766 Py_VISIT(self->inst_pers_func);
2767 Py_VISIT(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002768 return 0;
2769}
2770
2771static int
2772Pickler_clear(Picklerobject *self)
2773{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002774 Py_CLEAR(self->write);
2775 Py_CLEAR(self->memo);
2776 Py_CLEAR(self->fast_memo);
2777 Py_CLEAR(self->arg);
2778 Py_CLEAR(self->file);
2779 Py_CLEAR(self->pers_func);
2780 Py_CLEAR(self->inst_pers_func);
2781 Py_CLEAR(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002782 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002783}
2784
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002785static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002786Pickler_get_pers_func(Picklerobject *p)
2787{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002788 if (p->pers_func == NULL)
2789 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2790 else
2791 Py_INCREF(p->pers_func);
2792 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002793}
2794
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002795static int
2796Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2797{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002798 if (v == NULL) {
2799 PyErr_SetString(PyExc_TypeError,
2800 "attribute deletion is not supported");
2801 return -1;
2802 }
2803 Py_XDECREF(p->pers_func);
2804 Py_INCREF(v);
2805 p->pers_func = v;
2806 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002807}
2808
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002809static int
2810Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2811{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002812 if (v == NULL) {
2813 PyErr_SetString(PyExc_TypeError,
2814 "attribute deletion is not supported");
2815 return -1;
2816 }
2817 Py_XDECREF(p->inst_pers_func);
2818 Py_INCREF(v);
2819 p->inst_pers_func = v;
2820 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002821}
2822
2823static PyObject *
2824Pickler_get_memo(Picklerobject *p)
2825{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002826 if (p->memo == NULL)
2827 PyErr_SetString(PyExc_AttributeError, "memo");
2828 else
2829 Py_INCREF(p->memo);
2830 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002831}
2832
2833static int
2834Pickler_set_memo(Picklerobject *p, PyObject *v)
2835{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002836 if (v == NULL) {
2837 PyErr_SetString(PyExc_TypeError,
2838 "attribute deletion is not supported");
2839 return -1;
2840 }
2841 if (!PyDict_Check(v)) {
2842 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2843 return -1;
2844 }
2845 Py_XDECREF(p->memo);
2846 Py_INCREF(v);
2847 p->memo = v;
2848 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002849}
2850
2851static PyObject *
2852Pickler_get_error(Picklerobject *p)
2853{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002854 /* why is this an attribute on the Pickler? */
2855 Py_INCREF(PicklingError);
2856 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002857}
2858
2859static PyMemberDef Pickler_members[] = {
2860 {"binary", T_INT, offsetof(Picklerobject, bin)},
2861 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002862 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002863};
2864
2865static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002866 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002867 (setter)Pickler_set_pers_func},
2868 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2869 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002870 {"PicklingError", (getter)Pickler_get_error, NULL},
2871 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002872};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002873
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002874PyDoc_STRVAR(Picklertype__doc__,
2875"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002876
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002877static PyTypeObject Picklertype = {
2878 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002879 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002880 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002881 sizeof(Picklerobject), /*tp_basicsize*/
2882 0,
2883 (destructor)Pickler_dealloc, /* tp_dealloc */
2884 0, /* tp_print */
2885 0, /* tp_getattr */
2886 0, /* tp_setattr */
2887 0, /* tp_compare */
2888 0, /* tp_repr */
2889 0, /* tp_as_number */
2890 0, /* tp_as_sequence */
2891 0, /* tp_as_mapping */
2892 0, /* tp_hash */
2893 0, /* tp_call */
2894 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002895 PyObject_GenericGetAttr, /* tp_getattro */
2896 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002897 0, /* tp_as_buffer */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002898 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002899 Picklertype__doc__, /* tp_doc */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002900 (traverseproc)Pickler_traverse, /* tp_traverse */
2901 (inquiry)Pickler_clear, /* tp_clear */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002902 0, /* tp_richcompare */
2903 0, /* tp_weaklistoffset */
2904 0, /* tp_iter */
2905 0, /* tp_iternext */
2906 Pickler_methods, /* tp_methods */
2907 Pickler_members, /* tp_members */
2908 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002909};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002910
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002911static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002912find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002913{
2914 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002916 if (fc) {
2917 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00002918 PyErr_SetString(UnpicklingError, "Global and instance "
2919 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002920 return NULL;
2921 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002922 return PyObject_CallFunctionObjArgs(fc, py_module_name,
2923 py_global_name, NULL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002924 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002926 module = PySys_GetObject("modules");
2927 if (module == NULL)
2928 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002929
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002930 module = PyDict_GetItem(module, py_module_name);
2931 if (module == NULL) {
2932 module = PyImport_Import(py_module_name);
2933 if (!module)
2934 return NULL;
2935 global = PyObject_GetAttr(module, py_global_name);
2936 Py_DECREF(module);
2937 }
2938 else
2939 global = PyObject_GetAttr(module, py_global_name);
2940 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002941}
2942
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002943static int
Tim Peterscba30e22003-02-01 06:24:36 +00002944marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002945{
2946 if (self->num_marks < 1) {
2947 PyErr_SetString(UnpicklingError, "could not find MARK");
2948 return -1;
2949 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002950
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002951 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002952}
2953
Tim Peters84e87f32001-03-17 04:50:51 +00002954
Guido van Rossum60456fd1997-04-09 17:36:32 +00002955static int
Tim Peterscba30e22003-02-01 06:24:36 +00002956load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002957{
2958 PDATA_APPEND(self->stack, Py_None, -1);
2959 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002960}
2961
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002962static int
Tim Peterscba30e22003-02-01 06:24:36 +00002963bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002964{
2965 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2966 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002967}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002968
2969static int
Tim Peterscba30e22003-02-01 06:24:36 +00002970load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002971{
2972 PyObject *py_int = 0;
2973 char *endptr, *s;
2974 int len, res = -1;
2975 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002976
Tim Peters0bc93f52003-02-02 18:29:33 +00002977 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002978 if (len < 2) return bad_readline();
2979 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002981 errno = 0;
2982 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002983
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002984 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
2985 /* Hm, maybe we've got something long. Let's try reading
2986 it as a Python long object. */
2987 errno = 0;
2988 py_int = PyLong_FromString(s, NULL, 0);
2989 if (py_int == NULL) {
2990 PyErr_SetString(PyExc_ValueError,
2991 "could not convert string to int");
2992 goto finally;
2993 }
2994 }
2995 else {
Guido van Rossume2763392002-04-05 19:30:08 +00002996 if (len == 3 && (l == 0 || l == 1)) {
2997 if (!( py_int = PyBool_FromLong(l))) goto finally;
2998 }
2999 else {
3000 if (!( py_int = PyInt_FromLong(l))) goto finally;
3001 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003002 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003004 free(s);
3005 PDATA_PUSH(self->stack, py_int, -1);
3006 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003007
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003008 finally:
3009 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003010
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003011 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003012}
3013
Tim Peters3c67d792003-02-02 17:59:11 +00003014static int
3015load_bool(Unpicklerobject *self, PyObject *boolean)
3016{
3017 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00003018 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00003019 return 0;
3020}
3021
Tim Petersee1a53c2003-02-02 02:57:53 +00003022/* s contains x bytes of a little-endian integer. Return its value as a
3023 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3024 * int, but when x is 4 it's a signed one. This is an historical source
3025 * of x-platform bugs.
3026 */
Tim Peters84e87f32001-03-17 04:50:51 +00003027static long
Tim Petersee1a53c2003-02-02 02:57:53 +00003028calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003029{
3030 unsigned char c;
3031 int i;
3032 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003034 for (i = 0, l = 0L; i < x; i++) {
3035 c = (unsigned char)s[i];
3036 l |= (long)c << (i * 8);
3037 }
Tim Petersbfa18f72001-04-10 01:54:42 +00003038#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003039 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3040 * is signed, so on a box with longs bigger than 4 bytes we need
3041 * to extend a BININT's sign bit to the full width.
3042 */
3043 if (x == 4 && l & (1L << 31))
3044 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00003045#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003046 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003047}
3048
3049
3050static int
Tim Peterscba30e22003-02-01 06:24:36 +00003051load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003052{
3053 PyObject *py_int = 0;
3054 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003055
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003056 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003057
Tim Peterscba30e22003-02-01 06:24:36 +00003058 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003059 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003061 PDATA_PUSH(self->stack, py_int, -1);
3062 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003063}
3064
3065
3066static int
Tim Peterscba30e22003-02-01 06:24:36 +00003067load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003068{
3069 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003070
Tim Peters0bc93f52003-02-02 18:29:33 +00003071 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003072 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003073
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003074 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003075}
3076
3077
3078static int
Tim Peterscba30e22003-02-01 06:24:36 +00003079load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003080{
3081 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003082
Tim Peters0bc93f52003-02-02 18:29:33 +00003083 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003084 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003085
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003086 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003087}
3088
3089
3090static int
Tim Peterscba30e22003-02-01 06:24:36 +00003091load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003092{
3093 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003094
Tim Peters0bc93f52003-02-02 18:29:33 +00003095 if (self->read_func(self, &s, 2) < 0)
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 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003099}
Tim Peters84e87f32001-03-17 04:50:51 +00003100
Guido van Rossum60456fd1997-04-09 17:36:32 +00003101static int
Tim Peterscba30e22003-02-01 06:24:36 +00003102load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003103{
3104 PyObject *l = 0;
3105 char *end, *s;
3106 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003107
Tim Peters0bc93f52003-02-02 18:29:33 +00003108 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003109 if (len < 2) return bad_readline();
3110 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003111
Tim Peterscba30e22003-02-01 06:24:36 +00003112 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003113 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003114
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003115 free(s);
3116 PDATA_PUSH(self->stack, l, -1);
3117 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003119 finally:
3120 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003122 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003123}
3124
Tim Petersee1a53c2003-02-02 02:57:53 +00003125/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3126 * data following.
3127 */
3128static int
3129load_counted_long(Unpicklerobject *self, int size)
3130{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003131 Py_ssize_t i;
Tim Petersee1a53c2003-02-02 02:57:53 +00003132 char *nbytes;
3133 unsigned char *pdata;
3134 PyObject *along;
3135
3136 assert(size == 1 || size == 4);
3137 i = self->read_func(self, &nbytes, size);
3138 if (i < 0) return -1;
3139
3140 size = calc_binint(nbytes, size);
3141 if (size < 0) {
3142 /* Corrupt or hostile pickle -- we never write one like
3143 * this.
3144 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003145 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003146 "byte count");
3147 return -1;
3148 }
3149
3150 if (size == 0)
3151 along = PyLong_FromLong(0L);
3152 else {
3153 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003154 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003155 if (i < 0) return -1;
3156 along = _PyLong_FromByteArray(pdata, (size_t)size,
3157 1 /* little endian */, 1 /* signed */);
3158 }
3159 if (along == NULL)
3160 return -1;
3161 PDATA_PUSH(self->stack, along, -1);
3162 return 0;
3163}
Tim Peters84e87f32001-03-17 04:50:51 +00003164
Guido van Rossum60456fd1997-04-09 17:36:32 +00003165static int
Tim Peterscba30e22003-02-01 06:24:36 +00003166load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003167{
3168 PyObject *py_float = 0;
3169 char *endptr, *s;
3170 int len, res = -1;
3171 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003172
Tim Peters0bc93f52003-02-02 18:29:33 +00003173 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003174 if (len < 2) return bad_readline();
3175 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003177 errno = 0;
Martin v. Löwis737ea822004-06-08 18:52:54 +00003178 d = PyOS_ascii_strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003180 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3181 PyErr_SetString(PyExc_ValueError,
3182 "could not convert string to float");
3183 goto finally;
3184 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003185
Tim Peterscba30e22003-02-01 06:24:36 +00003186 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003187 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003188
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003189 free(s);
3190 PDATA_PUSH(self->stack, py_float, -1);
3191 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003193 finally:
3194 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003196 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003197}
3198
Guido van Rossum60456fd1997-04-09 17:36:32 +00003199static int
Tim Peterscba30e22003-02-01 06:24:36 +00003200load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003201{
Tim Peters9905b942003-03-20 20:53:32 +00003202 PyObject *py_float;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003203 double x;
3204 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003205
Tim Peters0bc93f52003-02-02 18:29:33 +00003206 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003207 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003208
Tim Peters9905b942003-03-20 20:53:32 +00003209 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3210 if (x == -1.0 && PyErr_Occurred())
3211 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003212
Tim Peters9905b942003-03-20 20:53:32 +00003213 py_float = PyFloat_FromDouble(x);
3214 if (py_float == NULL)
3215 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003217 PDATA_PUSH(self->stack, py_float, -1);
3218 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003219}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003220
3221static int
Tim Peterscba30e22003-02-01 06:24:36 +00003222load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003223{
3224 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003225 int len, res = -1;
3226 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003227
Tim Peters0bc93f52003-02-02 18:29:33 +00003228 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003229 if (len < 2) return bad_readline();
3230 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003231
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003232
3233 /* Strip outermost quotes */
3234 while (s[len-1] <= ' ')
3235 len--;
3236 if(s[0]=='"' && s[len-1]=='"'){
3237 s[len-1] = '\0';
3238 p = s + 1 ;
3239 len -= 2;
3240 } else if(s[0]=='\'' && s[len-1]=='\''){
3241 s[len-1] = '\0';
3242 p = s + 1 ;
3243 len -= 2;
3244 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003245 goto insecure;
3246 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003247
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003248 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003249 free(s);
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003250 if (str) {
3251 PDATA_PUSH(self->stack, str, -1);
3252 res = 0;
3253 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003254 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003255
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003256 insecure:
3257 free(s);
3258 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3259 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003260}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003261
3262
3263static int
Tim Peterscba30e22003-02-01 06:24:36 +00003264load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003265{
3266 PyObject *py_string = 0;
3267 long l;
3268 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003269
Tim Peters0bc93f52003-02-02 18:29:33 +00003270 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003272 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003273
Tim Peters0bc93f52003-02-02 18:29:33 +00003274 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003275 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003276
Tim Peterscba30e22003-02-01 06:24:36 +00003277 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003278 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003279
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003280 PDATA_PUSH(self->stack, py_string, -1);
3281 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003282}
3283
3284
3285static int
Tim Peterscba30e22003-02-01 06:24:36 +00003286load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003287{
3288 PyObject *py_string = 0;
3289 unsigned char l;
3290 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003291
Tim Peters0bc93f52003-02-02 18:29:33 +00003292 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003293 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003294
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003295 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003296
Tim Peters0bc93f52003-02-02 18:29:33 +00003297 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003298
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003299 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003300
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003301 PDATA_PUSH(self->stack, py_string, -1);
3302 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003303}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003304
3305
3306static int
Tim Peterscba30e22003-02-01 06:24:36 +00003307load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003308{
3309 PyObject *str = 0;
3310 int len, res = -1;
3311 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003312
Tim Peters0bc93f52003-02-02 18:29:33 +00003313 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003314 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003315
Tim Peterscba30e22003-02-01 06:24:36 +00003316 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003317 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003318
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003319 PDATA_PUSH(self->stack, str, -1);
3320 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003322 finally:
3323 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003324}
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003325
3326
3327static int
Tim Peterscba30e22003-02-01 06:24:36 +00003328load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003329{
3330 PyObject *unicode;
3331 long l;
3332 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003333
Tim Peters0bc93f52003-02-02 18:29:33 +00003334 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003336 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003337
Tim Peters0bc93f52003-02-02 18:29:33 +00003338 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003339 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003340
Tim Peterscba30e22003-02-01 06:24:36 +00003341 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003342 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003344 PDATA_PUSH(self->stack, unicode, -1);
3345 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003346}
3347
3348
3349static int
Tim Peterscba30e22003-02-01 06:24:36 +00003350load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003351{
3352 PyObject *tup;
3353 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003355 if ((i = marker(self)) < 0) return -1;
3356 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3357 PDATA_PUSH(self->stack, tup, -1);
3358 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003359}
3360
3361static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003362load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003363{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003364 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003365
Tim Peters1d63c9f2003-02-02 20:29:39 +00003366 if (tup == NULL)
3367 return -1;
3368
3369 while (--len >= 0) {
3370 PyObject *element;
3371
3372 PDATA_POP(self->stack, element);
3373 if (element == NULL)
3374 return -1;
3375 PyTuple_SET_ITEM(tup, len, element);
3376 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003377 PDATA_PUSH(self->stack, tup, -1);
3378 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003379}
3380
3381static int
Tim Peterscba30e22003-02-01 06:24:36 +00003382load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003383{
3384 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003386 if (!( list=PyList_New(0))) return -1;
3387 PDATA_PUSH(self->stack, list, -1);
3388 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003389}
3390
3391static int
Tim Peterscba30e22003-02-01 06:24:36 +00003392load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003393{
3394 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003396 if (!( dict=PyDict_New())) return -1;
3397 PDATA_PUSH(self->stack, dict, -1);
3398 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003399}
3400
3401
3402static int
Tim Peterscba30e22003-02-01 06:24:36 +00003403load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003404{
3405 PyObject *list = 0;
3406 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003408 if ((i = marker(self)) < 0) return -1;
3409 if (!( list=Pdata_popList(self->stack, i))) return -1;
3410 PDATA_PUSH(self->stack, list, -1);
3411 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003412}
3413
3414static int
Tim Peterscba30e22003-02-01 06:24:36 +00003415load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003416{
3417 PyObject *dict, *key, *value;
3418 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003420 if ((i = marker(self)) < 0) return -1;
3421 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003423 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003425 for (k = i+1; k < j; k += 2) {
3426 key =self->stack->data[k-1];
3427 value=self->stack->data[k ];
3428 if (PyDict_SetItem(dict, key, value) < 0) {
3429 Py_DECREF(dict);
3430 return -1;
3431 }
3432 }
3433 Pdata_clear(self->stack, i);
3434 PDATA_PUSH(self->stack, dict, -1);
3435 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003436}
3437
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003438static PyObject *
3439Instance_New(PyObject *cls, PyObject *args)
3440{
3441 PyObject *r = 0;
3442
3443 if ((r=PyObject_CallObject(cls, args))) return r;
3444
3445 {
3446 PyObject *tp, *v, *tb, *tmp_value;
3447
3448 PyErr_Fetch(&tp, &v, &tb);
3449 tmp_value = v;
3450 /* NULL occurs when there was a KeyboardInterrupt */
3451 if (tmp_value == NULL)
3452 tmp_value = Py_None;
3453 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {
3454 Py_XDECREF(v);
3455 v=r;
3456 }
3457 PyErr_Restore(tp,v,tb);
3458 }
3459 return NULL;
3460}
3461
Guido van Rossum60456fd1997-04-09 17:36:32 +00003462
3463static int
Tim Peterscba30e22003-02-01 06:24:36 +00003464load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003465{
3466 PyObject *class, *tup, *obj=0;
3467 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003468
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003469 if ((i = marker(self)) < 0) return -1;
3470 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3471 PDATA_POP(self->stack, class);
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003472 if (class) {
3473 obj = Instance_New(class, tup);
3474 Py_DECREF(class);
3475 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003476 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003477
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003478 if (! obj) return -1;
3479 PDATA_PUSH(self->stack, obj, -1);
3480 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003481}
3482
3483
3484static int
Tim Peterscba30e22003-02-01 06:24:36 +00003485load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003486{
3487 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3488 int i, len;
3489 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003491 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003492
Tim Peters0bc93f52003-02-02 18:29:33 +00003493 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003494 if (len < 2) return bad_readline();
3495 module_name = PyString_FromStringAndSize(s, len - 1);
3496 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003497
Tim Peters0bc93f52003-02-02 18:29:33 +00003498 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003499 if (len < 2) return bad_readline();
3500 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003501 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003502 self->find_class);
3503 Py_DECREF(class_name);
3504 }
3505 }
3506 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003508 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003510 if ((tup=Pdata_popTuple(self->stack, i))) {
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003511 obj = Instance_New(class, tup);
3512 Py_DECREF(tup);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003513 }
3514 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003516 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003517
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003518 PDATA_PUSH(self->stack, obj, -1);
3519 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003520}
3521
Tim Peterseab7db32003-02-13 18:24:14 +00003522static int
3523load_newobj(Unpicklerobject *self)
3524{
3525 PyObject *args = NULL;
3526 PyObject *clsraw = NULL;
3527 PyTypeObject *cls; /* clsraw cast to its true type */
3528 PyObject *obj;
3529
3530 /* Stack is ... cls argtuple, and we want to call
3531 * cls.__new__(cls, *argtuple).
3532 */
3533 PDATA_POP(self->stack, args);
3534 if (args == NULL) goto Fail;
3535 if (! PyTuple_Check(args)) {
3536 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3537 "tuple.");
3538 goto Fail;
3539 }
3540
3541 PDATA_POP(self->stack, clsraw);
3542 cls = (PyTypeObject *)clsraw;
3543 if (cls == NULL) goto Fail;
3544 if (! PyType_Check(cls)) {
3545 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3546 "isn't a type object");
3547 goto Fail;
3548 }
3549 if (cls->tp_new == NULL) {
3550 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3551 "has NULL tp_new");
3552 goto Fail;
3553 }
3554
3555 /* Call __new__. */
3556 obj = cls->tp_new(cls, args, NULL);
3557 if (obj == NULL) goto Fail;
3558
3559 Py_DECREF(args);
3560 Py_DECREF(clsraw);
3561 PDATA_PUSH(self->stack, obj, -1);
3562 return 0;
3563
3564 Fail:
3565 Py_XDECREF(args);
3566 Py_XDECREF(clsraw);
3567 return -1;
3568}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003569
3570static int
Tim Peterscba30e22003-02-01 06:24:36 +00003571load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003572{
3573 PyObject *class = 0, *module_name = 0, *class_name = 0;
3574 int len;
3575 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003576
Tim Peters0bc93f52003-02-02 18:29:33 +00003577 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003578 if (len < 2) return bad_readline();
3579 module_name = PyString_FromStringAndSize(s, len - 1);
3580 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003581
Tim Peters0bc93f52003-02-02 18:29:33 +00003582 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003583 if (len < 2) {
3584 Py_DECREF(module_name);
3585 return bad_readline();
3586 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003587 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003588 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003589 self->find_class);
3590 Py_DECREF(class_name);
3591 }
3592 }
3593 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003594
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003595 if (! class) return -1;
3596 PDATA_PUSH(self->stack, class, -1);
3597 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003598}
3599
3600
3601static int
Tim Peterscba30e22003-02-01 06:24:36 +00003602load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003603{
3604 PyObject *pid = 0;
3605 int len;
3606 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003608 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003609 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003610 if (len < 2) return bad_readline();
3611
3612 pid = PyString_FromStringAndSize(s, len - 1);
3613 if (!pid) return -1;
3614
3615 if (PyList_Check(self->pers_func)) {
3616 if (PyList_Append(self->pers_func, pid) < 0) {
3617 Py_DECREF(pid);
3618 return -1;
3619 }
3620 }
3621 else {
3622 ARG_TUP(self, pid);
3623 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003624 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003625 NULL);
3626 FREE_ARG_TUP(self);
3627 }
3628 }
3629
3630 if (! pid) return -1;
3631
3632 PDATA_PUSH(self->stack, pid, -1);
3633 return 0;
3634 }
3635 else {
3636 PyErr_SetString(UnpicklingError,
3637 "A load persistent id instruction was encountered,\n"
3638 "but no persistent_load function was specified.");
3639 return -1;
3640 }
3641}
3642
3643static int
Tim Peterscba30e22003-02-01 06:24:36 +00003644load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003645{
3646 PyObject *pid = 0;
3647
3648 if (self->pers_func) {
3649 PDATA_POP(self->stack, pid);
3650 if (! pid) return -1;
3651
3652 if (PyList_Check(self->pers_func)) {
3653 if (PyList_Append(self->pers_func, pid) < 0) {
3654 Py_DECREF(pid);
3655 return -1;
3656 }
3657 }
3658 else {
3659 ARG_TUP(self, pid);
3660 if (self->arg) {
3661 pid = PyObject_Call(self->pers_func, self->arg,
3662 NULL);
3663 FREE_ARG_TUP(self);
3664 }
3665 if (! pid) return -1;
3666 }
3667
3668 PDATA_PUSH(self->stack, pid, -1);
3669 return 0;
3670 }
3671 else {
3672 PyErr_SetString(UnpicklingError,
3673 "A load persistent id instruction was encountered,\n"
3674 "but no persistent_load function was specified.");
3675 return -1;
3676 }
3677}
3678
3679
3680static int
Tim Peterscba30e22003-02-01 06:24:36 +00003681load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003682{
3683 int len;
3684
3685 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3686
3687 /* Note that we split the (pickle.py) stack into two stacks,
3688 an object stack and a mark stack. We have to be clever and
3689 pop the right one. We do this by looking at the top of the
3690 mark stack.
3691 */
3692
3693 if ((self->num_marks > 0) &&
3694 (self->marks[self->num_marks - 1] == len))
3695 self->num_marks--;
3696 else {
3697 len--;
3698 Py_DECREF(self->stack->data[len]);
3699 self->stack->length=len;
3700 }
3701
3702 return 0;
3703}
3704
3705
3706static int
Tim Peterscba30e22003-02-01 06:24:36 +00003707load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003708{
3709 int i;
3710
3711 if ((i = marker(self)) < 0)
3712 return -1;
3713
3714 Pdata_clear(self->stack, i);
3715
3716 return 0;
3717}
3718
3719
3720static int
Tim Peterscba30e22003-02-01 06:24:36 +00003721load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003722{
3723 PyObject *last;
3724 int len;
3725
3726 if ((len = self->stack->length) <= 0) return stackUnderflow();
3727 last=self->stack->data[len-1];
3728 Py_INCREF(last);
3729 PDATA_PUSH(self->stack, last, -1);
3730 return 0;
3731}
3732
3733
3734static int
Tim Peterscba30e22003-02-01 06:24:36 +00003735load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003736{
3737 PyObject *py_str = 0, *value = 0;
3738 int len;
3739 char *s;
3740 int rc;
3741
Tim Peters0bc93f52003-02-02 18:29:33 +00003742 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003743 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003745 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003747 value = PyDict_GetItem(self->memo, py_str);
3748 if (! value) {
3749 PyErr_SetObject(BadPickleGet, py_str);
3750 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003751 }
3752 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003753 PDATA_APPEND(self->stack, value, -1);
3754 rc = 0;
3755 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003757 Py_DECREF(py_str);
3758 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003759}
3760
3761
3762static int
Tim Peterscba30e22003-02-01 06:24:36 +00003763load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003764{
3765 PyObject *py_key = 0, *value = 0;
3766 unsigned char key;
3767 char *s;
3768 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003769
Tim Peters0bc93f52003-02-02 18:29:33 +00003770 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003771
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003772 key = (unsigned char)s[0];
3773 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003774
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003775 value = PyDict_GetItem(self->memo, py_key);
3776 if (! value) {
3777 PyErr_SetObject(BadPickleGet, py_key);
3778 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003779 }
3780 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003781 PDATA_APPEND(self->stack, value, -1);
3782 rc = 0;
3783 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003785 Py_DECREF(py_key);
3786 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003787}
3788
3789
3790static int
Tim Peterscba30e22003-02-01 06:24:36 +00003791load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003792{
3793 PyObject *py_key = 0, *value = 0;
3794 unsigned char c;
3795 char *s;
3796 long key;
3797 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003798
Tim Peters0bc93f52003-02-02 18:29:33 +00003799 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003800
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003801 c = (unsigned char)s[0];
3802 key = (long)c;
3803 c = (unsigned char)s[1];
3804 key |= (long)c << 8;
3805 c = (unsigned char)s[2];
3806 key |= (long)c << 16;
3807 c = (unsigned char)s[3];
3808 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003809
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003810 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3811
3812 value = PyDict_GetItem(self->memo, py_key);
3813 if (! value) {
3814 PyErr_SetObject(BadPickleGet, py_key);
3815 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003816 }
3817 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003818 PDATA_APPEND(self->stack, value, -1);
3819 rc = 0;
3820 }
3821
3822 Py_DECREF(py_key);
3823 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003824}
3825
Tim Peters2d629652003-02-04 05:06:17 +00003826/* Push an object from the extension registry (EXT[124]). nbytes is
3827 * the number of bytes following the opcode, holding the index (code) value.
3828 */
3829static int
3830load_extension(Unpicklerobject *self, int nbytes)
3831{
3832 char *codebytes; /* the nbytes bytes after the opcode */
3833 long code; /* calc_binint returns long */
3834 PyObject *py_code; /* code as a Python int */
3835 PyObject *obj; /* the object to push */
3836 PyObject *pair; /* (module_name, class_name) */
3837 PyObject *module_name, *class_name;
3838
3839 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
3840 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
3841 code = calc_binint(codebytes, nbytes);
3842 if (code <= 0) { /* note that 0 is forbidden */
3843 /* Corrupt or hostile pickle. */
3844 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
3845 return -1;
3846 }
3847
3848 /* Look for the code in the cache. */
3849 py_code = PyInt_FromLong(code);
3850 if (py_code == NULL) return -1;
3851 obj = PyDict_GetItem(extension_cache, py_code);
3852 if (obj != NULL) {
3853 /* Bingo. */
3854 Py_DECREF(py_code);
3855 PDATA_APPEND(self->stack, obj, -1);
3856 return 0;
3857 }
3858
3859 /* Look up the (module_name, class_name) pair. */
3860 pair = PyDict_GetItem(inverted_registry, py_code);
3861 if (pair == NULL) {
3862 Py_DECREF(py_code);
3863 PyErr_Format(PyExc_ValueError, "unregistered extension "
3864 "code %ld", code);
3865 return -1;
3866 }
3867 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00003868 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00003869 */
3870 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
3871 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
3872 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
3873 Py_DECREF(py_code);
3874 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
3875 "isn't a 2-tuple of strings", code);
3876 return -1;
3877 }
3878 /* Load the object. */
3879 obj = find_class(module_name, class_name, self->find_class);
3880 if (obj == NULL) {
3881 Py_DECREF(py_code);
3882 return -1;
3883 }
3884 /* Cache code -> obj. */
3885 code = PyDict_SetItem(extension_cache, py_code, obj);
3886 Py_DECREF(py_code);
3887 if (code < 0) {
3888 Py_DECREF(obj);
3889 return -1;
3890 }
3891 PDATA_PUSH(self->stack, obj, -1);
3892 return 0;
3893}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003894
3895static int
Tim Peterscba30e22003-02-01 06:24:36 +00003896load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003897{
3898 PyObject *py_str = 0, *value = 0;
3899 int len, l;
3900 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003901
Tim Peters0bc93f52003-02-02 18:29:33 +00003902 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003903 if (l < 2) return bad_readline();
3904 if (!( len=self->stack->length )) return stackUnderflow();
3905 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3906 value=self->stack->data[len-1];
3907 l=PyDict_SetItem(self->memo, py_str, value);
3908 Py_DECREF(py_str);
3909 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003910}
3911
3912
3913static int
Tim Peterscba30e22003-02-01 06:24:36 +00003914load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003915{
3916 PyObject *py_key = 0, *value = 0;
3917 unsigned char key;
3918 char *s;
3919 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003920
Tim Peters0bc93f52003-02-02 18:29:33 +00003921 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003922 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003924 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003925
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003926 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3927 value=self->stack->data[len-1];
3928 len=PyDict_SetItem(self->memo, py_key, value);
3929 Py_DECREF(py_key);
3930 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003931}
3932
3933
3934static int
Tim Peterscba30e22003-02-01 06:24:36 +00003935load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003936{
3937 PyObject *py_key = 0, *value = 0;
3938 long key;
3939 unsigned char c;
3940 char *s;
3941 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003942
Tim Peters0bc93f52003-02-02 18:29:33 +00003943 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003944 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003946 c = (unsigned char)s[0];
3947 key = (long)c;
3948 c = (unsigned char)s[1];
3949 key |= (long)c << 8;
3950 c = (unsigned char)s[2];
3951 key |= (long)c << 16;
3952 c = (unsigned char)s[3];
3953 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003955 if (!( py_key = PyInt_FromLong(key))) return -1;
3956 value=self->stack->data[len-1];
3957 len=PyDict_SetItem(self->memo, py_key, value);
3958 Py_DECREF(py_key);
3959 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003960}
3961
3962
3963static int
Tim Peterscba30e22003-02-01 06:24:36 +00003964do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003965{
3966 PyObject *value = 0, *list = 0, *append_method = 0;
3967 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003968
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003969 len=self->stack->length;
3970 if (!( len >= x && x > 0 )) return stackUnderflow();
3971 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003972 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003973
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003974 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003975
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003976 if (PyList_Check(list)) {
3977 PyObject *slice;
3978 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003979
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003980 slice=Pdata_popList(self->stack, x);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003981 if (! slice) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003982 list_len = PyList_GET_SIZE(list);
3983 i=PyList_SetSlice(list, list_len, list_len, slice);
3984 Py_DECREF(slice);
3985 return i;
3986 }
3987 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00003988
Tim Peterscba30e22003-02-01 06:24:36 +00003989 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003990 return -1;
3991
3992 for (i = x; i < len; i++) {
3993 PyObject *junk;
3994
3995 value=self->stack->data[i];
3996 junk=0;
3997 ARG_TUP(self, value);
3998 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003999 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004000 NULL);
4001 FREE_ARG_TUP(self);
4002 }
4003 if (! junk) {
4004 Pdata_clear(self->stack, i+1);
4005 self->stack->length=x;
4006 Py_DECREF(append_method);
4007 return -1;
4008 }
4009 Py_DECREF(junk);
4010 }
4011 self->stack->length=x;
4012 Py_DECREF(append_method);
4013 }
4014
4015 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004016}
4017
4018
4019static int
Tim Peterscba30e22003-02-01 06:24:36 +00004020load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004021{
4022 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004023}
4024
4025
4026static int
Tim Peterscba30e22003-02-01 06:24:36 +00004027load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004028{
4029 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004030}
4031
4032
4033static int
Tim Peterscba30e22003-02-01 06:24:36 +00004034do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004035{
4036 PyObject *value = 0, *key = 0, *dict = 0;
4037 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004038
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004039 if (!( (len=self->stack->length) >= x
4040 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004042 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004043
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004044 for (i = x+1; i < len; i += 2) {
4045 key =self->stack->data[i-1];
4046 value=self->stack->data[i ];
4047 if (PyObject_SetItem(dict, key, value) < 0) {
4048 r=-1;
4049 break;
4050 }
4051 }
4052
4053 Pdata_clear(self->stack, x);
4054
4055 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004056}
4057
4058
Tim Peters84e87f32001-03-17 04:50:51 +00004059static int
Tim Peterscba30e22003-02-01 06:24:36 +00004060load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004061{
4062 return do_setitems(self, self->stack->length - 2);
4063}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004064
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004065static int
Tim Peterscba30e22003-02-01 06:24:36 +00004066load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004067{
4068 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004069}
4070
Tim Peters84e87f32001-03-17 04:50:51 +00004071
Guido van Rossum60456fd1997-04-09 17:36:32 +00004072static int
Tim Peterscba30e22003-02-01 06:24:36 +00004073load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004074{
Tim Peters080c88b2003-02-15 03:01:11 +00004075 PyObject *state, *inst, *slotstate;
4076 PyObject *__setstate__;
4077 PyObject *d_key, *d_value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004078 Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00004079 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004080
Tim Peters080c88b2003-02-15 03:01:11 +00004081 /* Stack is ... instance, state. We want to leave instance at
4082 * the stack top, possibly mutated via instance.__setstate__(state).
4083 */
4084 if (self->stack->length < 2)
4085 return stackUnderflow();
4086 PDATA_POP(self->stack, state);
4087 if (state == NULL)
4088 return -1;
4089 inst = self->stack->data[self->stack->length - 1];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004090
Tim Peters080c88b2003-02-15 03:01:11 +00004091 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
4092 if (__setstate__ != NULL) {
4093 PyObject *junk = NULL;
4094
4095 /* The explicit __setstate__ is responsible for everything. */
4096 ARG_TUP(self, state);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004097 if (self->arg) {
4098 junk = PyObject_Call(__setstate__, self->arg, NULL);
4099 FREE_ARG_TUP(self);
4100 }
4101 Py_DECREF(__setstate__);
Tim Peters080c88b2003-02-15 03:01:11 +00004102 if (junk == NULL)
4103 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004104 Py_DECREF(junk);
4105 return 0;
4106 }
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00004107 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4108 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004109 PyErr_Clear();
Tim Peters080c88b2003-02-15 03:01:11 +00004110
4111 /* A default __setstate__. First see whether state embeds a
4112 * slot state dict too (a proto 2 addition).
4113 */
4114 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
4115 PyObject *temp = state;
4116 state = PyTuple_GET_ITEM(temp, 0);
4117 slotstate = PyTuple_GET_ITEM(temp, 1);
4118 Py_INCREF(state);
4119 Py_INCREF(slotstate);
4120 Py_DECREF(temp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004121 }
Tim Peters080c88b2003-02-15 03:01:11 +00004122 else
4123 slotstate = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004124
Tim Peters080c88b2003-02-15 03:01:11 +00004125 /* Set inst.__dict__ from the state dict (if any). */
4126 if (state != Py_None) {
4127 PyObject *dict;
4128 if (! PyDict_Check(state)) {
4129 PyErr_SetString(UnpicklingError, "state is not a "
4130 "dictionary");
4131 goto finally;
4132 }
4133 dict = PyObject_GetAttr(inst, __dict___str);
4134 if (dict == NULL)
4135 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004136
Tim Peters080c88b2003-02-15 03:01:11 +00004137 i = 0;
4138 while (PyDict_Next(state, &i, &d_key, &d_value)) {
4139 if (PyObject_SetItem(dict, d_key, d_value) < 0)
4140 goto finally;
4141 }
4142 Py_DECREF(dict);
4143 }
4144
4145 /* Also set instance attributes from the slotstate dict (if any). */
4146 if (slotstate != NULL) {
4147 if (! PyDict_Check(slotstate)) {
4148 PyErr_SetString(UnpicklingError, "slot state is not "
4149 "a dictionary");
4150 goto finally;
4151 }
4152 i = 0;
4153 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4154 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4155 goto finally;
4156 }
4157 }
4158 res = 0;
4159
4160 finally:
4161 Py_DECREF(state);
4162 Py_XDECREF(slotstate);
4163 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004164}
4165
4166
4167static int
Tim Peterscba30e22003-02-01 06:24:36 +00004168load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004169{
4170 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004172 /* Note that we split the (pickle.py) stack into two stacks, an
4173 object stack and a mark stack. Here we push a mark onto the
4174 mark stack.
4175 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004177 if ((self->num_marks + 1) >= self->marks_size) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00004178 int *marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004179 s=self->marks_size+20;
4180 if (s <= self->num_marks) s=self->num_marks + 1;
4181 if (self->marks == NULL)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004182 marks=(int *)malloc(s * sizeof(int));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004183 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00004184 marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004185 s * sizeof(int));
Guido van Rossumd8faa362007-04-27 19:54:29 +00004186 if (!marks) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004187 PyErr_NoMemory();
4188 return -1;
4189 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004190 self->marks = marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004191 self->marks_size = s;
4192 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004194 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004196 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004197}
4198
Guido van Rossum60456fd1997-04-09 17:36:32 +00004199static int
Tim Peterscba30e22003-02-01 06:24:36 +00004200load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004201{
4202 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004204 PDATA_POP(self->stack, arg_tup);
4205 if (! arg_tup) return -1;
4206 PDATA_POP(self->stack, callable);
Guido van Rossum512ab9f2006-08-17 22:28:49 +00004207 if (callable) {
4208 ob = Instance_New(callable, arg_tup);
4209 Py_DECREF(callable);
4210 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004211 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004212
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004213 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004215 PDATA_PUSH(self->stack, ob, -1);
4216 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004217}
Tim Peters84e87f32001-03-17 04:50:51 +00004218
Tim Peters4190fb82003-02-02 16:09:05 +00004219/* Just raises an error if we don't know the protocol specified. PROTO
4220 * is the first opcode for protocols >= 2.
4221 */
4222static int
4223load_proto(Unpicklerobject *self)
4224{
4225 int i;
4226 char *protobyte;
4227
4228 i = self->read_func(self, &protobyte, 1);
4229 if (i < 0)
4230 return -1;
4231
4232 i = calc_binint(protobyte, 1);
4233 /* No point checking for < 0, since calc_binint returns an unsigned
4234 * int when chewing on 1 byte.
4235 */
4236 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004237 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004238 return 0;
4239
4240 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4241 return -1;
4242}
4243
Guido van Rossum60456fd1997-04-09 17:36:32 +00004244static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004245load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004246{
4247 PyObject *err = 0, *val = 0;
4248 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004249
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004250 self->num_marks = 0;
4251 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004252
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004253 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004254 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004255 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004256
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004257 switch (s[0]) {
4258 case NONE:
4259 if (load_none(self) < 0)
4260 break;
4261 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004263 case BININT:
4264 if (load_binint(self) < 0)
4265 break;
4266 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004268 case BININT1:
4269 if (load_binint1(self) < 0)
4270 break;
4271 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004272
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004273 case BININT2:
4274 if (load_binint2(self) < 0)
4275 break;
4276 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004278 case INT:
4279 if (load_int(self) < 0)
4280 break;
4281 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004282
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004283 case LONG:
4284 if (load_long(self) < 0)
4285 break;
4286 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004287
Tim Petersee1a53c2003-02-02 02:57:53 +00004288 case LONG1:
4289 if (load_counted_long(self, 1) < 0)
4290 break;
4291 continue;
4292
4293 case LONG4:
4294 if (load_counted_long(self, 4) < 0)
4295 break;
4296 continue;
4297
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004298 case FLOAT:
4299 if (load_float(self) < 0)
4300 break;
4301 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004303 case BINFLOAT:
4304 if (load_binfloat(self) < 0)
4305 break;
4306 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004307
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004308 case BINSTRING:
4309 if (load_binstring(self) < 0)
4310 break;
4311 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004312
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004313 case SHORT_BINSTRING:
4314 if (load_short_binstring(self) < 0)
4315 break;
4316 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004317
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004318 case STRING:
4319 if (load_string(self) < 0)
4320 break;
4321 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004322
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004323 case UNICODE:
4324 if (load_unicode(self) < 0)
4325 break;
4326 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004327
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004328 case BINUNICODE:
4329 if (load_binunicode(self) < 0)
4330 break;
4331 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004332
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004333 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004334 if (load_counted_tuple(self, 0) < 0)
4335 break;
4336 continue;
4337
4338 case TUPLE1:
4339 if (load_counted_tuple(self, 1) < 0)
4340 break;
4341 continue;
4342
4343 case TUPLE2:
4344 if (load_counted_tuple(self, 2) < 0)
4345 break;
4346 continue;
4347
4348 case TUPLE3:
4349 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004350 break;
4351 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004353 case TUPLE:
4354 if (load_tuple(self) < 0)
4355 break;
4356 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004358 case EMPTY_LIST:
4359 if (load_empty_list(self) < 0)
4360 break;
4361 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004362
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004363 case LIST:
4364 if (load_list(self) < 0)
4365 break;
4366 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004367
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004368 case EMPTY_DICT:
4369 if (load_empty_dict(self) < 0)
4370 break;
4371 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004372
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004373 case DICT:
4374 if (load_dict(self) < 0)
4375 break;
4376 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004377
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004378 case OBJ:
4379 if (load_obj(self) < 0)
4380 break;
4381 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004383 case INST:
4384 if (load_inst(self) < 0)
4385 break;
4386 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004387
Tim Peterseab7db32003-02-13 18:24:14 +00004388 case NEWOBJ:
4389 if (load_newobj(self) < 0)
4390 break;
4391 continue;
4392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004393 case GLOBAL:
4394 if (load_global(self) < 0)
4395 break;
4396 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004398 case APPEND:
4399 if (load_append(self) < 0)
4400 break;
4401 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004403 case APPENDS:
4404 if (load_appends(self) < 0)
4405 break;
4406 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004408 case BUILD:
4409 if (load_build(self) < 0)
4410 break;
4411 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004413 case DUP:
4414 if (load_dup(self) < 0)
4415 break;
4416 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004417
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004418 case BINGET:
4419 if (load_binget(self) < 0)
4420 break;
4421 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004423 case LONG_BINGET:
4424 if (load_long_binget(self) < 0)
4425 break;
4426 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004427
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004428 case GET:
4429 if (load_get(self) < 0)
4430 break;
4431 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004432
Tim Peters2d629652003-02-04 05:06:17 +00004433 case EXT1:
4434 if (load_extension(self, 1) < 0)
4435 break;
4436 continue;
4437
4438 case EXT2:
4439 if (load_extension(self, 2) < 0)
4440 break;
4441 continue;
4442
4443 case EXT4:
4444 if (load_extension(self, 4) < 0)
4445 break;
4446 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004447 case MARK:
4448 if (load_mark(self) < 0)
4449 break;
4450 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004452 case BINPUT:
4453 if (load_binput(self) < 0)
4454 break;
4455 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004456
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004457 case LONG_BINPUT:
4458 if (load_long_binput(self) < 0)
4459 break;
4460 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004461
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004462 case PUT:
4463 if (load_put(self) < 0)
4464 break;
4465 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004466
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004467 case POP:
4468 if (load_pop(self) < 0)
4469 break;
4470 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004472 case POP_MARK:
4473 if (load_pop_mark(self) < 0)
4474 break;
4475 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004476
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004477 case SETITEM:
4478 if (load_setitem(self) < 0)
4479 break;
4480 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004481
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004482 case SETITEMS:
4483 if (load_setitems(self) < 0)
4484 break;
4485 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004487 case STOP:
4488 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004490 case PERSID:
4491 if (load_persid(self) < 0)
4492 break;
4493 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004494
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004495 case BINPERSID:
4496 if (load_binpersid(self) < 0)
4497 break;
4498 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004499
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004500 case REDUCE:
4501 if (load_reduce(self) < 0)
4502 break;
4503 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004504
Tim Peters4190fb82003-02-02 16:09:05 +00004505 case PROTO:
4506 if (load_proto(self) < 0)
4507 break;
4508 continue;
4509
Tim Peters3c67d792003-02-02 17:59:11 +00004510 case NEWTRUE:
4511 if (load_bool(self, Py_True) < 0)
4512 break;
4513 continue;
4514
4515 case NEWFALSE:
4516 if (load_bool(self, Py_False) < 0)
4517 break;
4518 continue;
4519
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004520 case '\0':
4521 /* end of file */
4522 PyErr_SetNone(PyExc_EOFError);
4523 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004525 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004526 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004527 "invalid load key, '%s'.",
4528 "c", s[0]);
4529 return NULL;
4530 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004531
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004532 break;
4533 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004534
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004535 if ((err = PyErr_Occurred())) {
4536 if (err == PyExc_EOFError) {
4537 PyErr_SetNone(PyExc_EOFError);
4538 }
4539 return NULL;
4540 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004542 PDATA_POP(self->stack, val);
4543 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004544}
Tim Peters84e87f32001-03-17 04:50:51 +00004545
Guido van Rossum60456fd1997-04-09 17:36:32 +00004546
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004547/* No-load functions to support noload, which is used to
4548 find persistent references. */
4549
4550static int
Tim Peterscba30e22003-02-01 06:24:36 +00004551noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004552{
4553 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004555 if ((i = marker(self)) < 0) return -1;
4556 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004557}
4558
4559
4560static int
Tim Peterscba30e22003-02-01 06:24:36 +00004561noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004562{
4563 int i;
4564 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004565
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004566 if ((i = marker(self)) < 0) return -1;
4567 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004568 if (self->readline_func(self, &s) < 0) return -1;
4569 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00004570 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004571 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004572}
4573
4574static int
Tim Peterseab7db32003-02-13 18:24:14 +00004575noload_newobj(Unpicklerobject *self)
4576{
4577 PyObject *obj;
4578
4579 PDATA_POP(self->stack, obj); /* pop argtuple */
4580 if (obj == NULL) return -1;
4581 Py_DECREF(obj);
4582
4583 PDATA_POP(self->stack, obj); /* pop cls */
4584 if (obj == NULL) return -1;
4585 Py_DECREF(obj);
4586
4587 PDATA_APPEND(self->stack, Py_None, -1);
4588 return 0;
4589}
4590
4591static int
Tim Peterscba30e22003-02-01 06:24:36 +00004592noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004593{
4594 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004595
Tim Peters0bc93f52003-02-02 18:29:33 +00004596 if (self->readline_func(self, &s) < 0) return -1;
4597 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004598 PDATA_APPEND(self->stack, Py_None,-1);
4599 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004600}
4601
4602static int
Tim Peterscba30e22003-02-01 06:24:36 +00004603noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004604{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004606 if (self->stack->length < 2) return stackUnderflow();
4607 Pdata_clear(self->stack, self->stack->length-2);
4608 PDATA_APPEND(self->stack, Py_None,-1);
4609 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004610}
4611
4612static int
4613noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004614
Guido van Rossum053b8df1998-11-25 16:18:00 +00004615 if (self->stack->length < 1) return stackUnderflow();
4616 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004617 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004618}
4619
Tim Peters2d629652003-02-04 05:06:17 +00004620static int
4621noload_extension(Unpicklerobject *self, int nbytes)
4622{
4623 char *codebytes;
4624
4625 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4626 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4627 PDATA_APPEND(self->stack, Py_None, -1);
4628 return 0;
4629}
4630
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004631
4632static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004633noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004634{
4635 PyObject *err = 0, *val = 0;
4636 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004637
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004638 self->num_marks = 0;
4639 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004640
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004641 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004642 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004643 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004644
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004645 switch (s[0]) {
4646 case NONE:
4647 if (load_none(self) < 0)
4648 break;
4649 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004651 case BININT:
4652 if (load_binint(self) < 0)
4653 break;
4654 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004655
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004656 case BININT1:
4657 if (load_binint1(self) < 0)
4658 break;
4659 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004660
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004661 case BININT2:
4662 if (load_binint2(self) < 0)
4663 break;
4664 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004665
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004666 case INT:
4667 if (load_int(self) < 0)
4668 break;
4669 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004671 case LONG:
4672 if (load_long(self) < 0)
4673 break;
4674 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004675
Tim Peters4190fb82003-02-02 16:09:05 +00004676 case LONG1:
4677 if (load_counted_long(self, 1) < 0)
4678 break;
4679 continue;
4680
4681 case LONG4:
4682 if (load_counted_long(self, 4) < 0)
4683 break;
4684 continue;
4685
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004686 case FLOAT:
4687 if (load_float(self) < 0)
4688 break;
4689 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004691 case BINFLOAT:
4692 if (load_binfloat(self) < 0)
4693 break;
4694 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004695
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004696 case BINSTRING:
4697 if (load_binstring(self) < 0)
4698 break;
4699 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004700
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004701 case SHORT_BINSTRING:
4702 if (load_short_binstring(self) < 0)
4703 break;
4704 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004706 case STRING:
4707 if (load_string(self) < 0)
4708 break;
4709 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004711 case UNICODE:
4712 if (load_unicode(self) < 0)
4713 break;
4714 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004716 case BINUNICODE:
4717 if (load_binunicode(self) < 0)
4718 break;
4719 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004721 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004722 if (load_counted_tuple(self, 0) < 0)
4723 break;
4724 continue;
4725
4726 case TUPLE1:
4727 if (load_counted_tuple(self, 1) < 0)
4728 break;
4729 continue;
4730
4731 case TUPLE2:
4732 if (load_counted_tuple(self, 2) < 0)
4733 break;
4734 continue;
4735
4736 case TUPLE3:
4737 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004738 break;
4739 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004740
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004741 case TUPLE:
4742 if (load_tuple(self) < 0)
4743 break;
4744 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004746 case EMPTY_LIST:
4747 if (load_empty_list(self) < 0)
4748 break;
4749 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004750
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004751 case LIST:
4752 if (load_list(self) < 0)
4753 break;
4754 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004756 case EMPTY_DICT:
4757 if (load_empty_dict(self) < 0)
4758 break;
4759 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004760
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004761 case DICT:
4762 if (load_dict(self) < 0)
4763 break;
4764 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004765
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004766 case OBJ:
4767 if (noload_obj(self) < 0)
4768 break;
4769 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004770
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004771 case INST:
4772 if (noload_inst(self) < 0)
4773 break;
4774 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004775
Tim Peterseab7db32003-02-13 18:24:14 +00004776 case NEWOBJ:
4777 if (noload_newobj(self) < 0)
4778 break;
4779 continue;
4780
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004781 case GLOBAL:
4782 if (noload_global(self) < 0)
4783 break;
4784 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004785
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004786 case APPEND:
4787 if (load_append(self) < 0)
4788 break;
4789 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004791 case APPENDS:
4792 if (load_appends(self) < 0)
4793 break;
4794 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004796 case BUILD:
4797 if (noload_build(self) < 0)
4798 break;
4799 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004800
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004801 case DUP:
4802 if (load_dup(self) < 0)
4803 break;
4804 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004806 case BINGET:
4807 if (load_binget(self) < 0)
4808 break;
4809 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004811 case LONG_BINGET:
4812 if (load_long_binget(self) < 0)
4813 break;
4814 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004815
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004816 case GET:
4817 if (load_get(self) < 0)
4818 break;
4819 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004820
Tim Peters2d629652003-02-04 05:06:17 +00004821 case EXT1:
4822 if (noload_extension(self, 1) < 0)
4823 break;
4824 continue;
4825
4826 case EXT2:
4827 if (noload_extension(self, 2) < 0)
4828 break;
4829 continue;
4830
4831 case EXT4:
4832 if (noload_extension(self, 4) < 0)
4833 break;
4834 continue;
4835
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004836 case MARK:
4837 if (load_mark(self) < 0)
4838 break;
4839 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004840
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004841 case BINPUT:
4842 if (load_binput(self) < 0)
4843 break;
4844 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004846 case LONG_BINPUT:
4847 if (load_long_binput(self) < 0)
4848 break;
4849 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004851 case PUT:
4852 if (load_put(self) < 0)
4853 break;
4854 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004855
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004856 case POP:
4857 if (load_pop(self) < 0)
4858 break;
4859 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004861 case POP_MARK:
4862 if (load_pop_mark(self) < 0)
4863 break;
4864 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004865
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004866 case SETITEM:
4867 if (load_setitem(self) < 0)
4868 break;
4869 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004870
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004871 case SETITEMS:
4872 if (load_setitems(self) < 0)
4873 break;
4874 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004876 case STOP:
4877 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004879 case PERSID:
4880 if (load_persid(self) < 0)
4881 break;
4882 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004884 case BINPERSID:
4885 if (load_binpersid(self) < 0)
4886 break;
4887 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004888
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004889 case REDUCE:
4890 if (noload_reduce(self) < 0)
4891 break;
4892 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004893
Tim Peters4190fb82003-02-02 16:09:05 +00004894 case PROTO:
4895 if (load_proto(self) < 0)
4896 break;
4897 continue;
4898
Tim Peters3c67d792003-02-02 17:59:11 +00004899 case NEWTRUE:
4900 if (load_bool(self, Py_True) < 0)
4901 break;
4902 continue;
4903
4904 case NEWFALSE:
4905 if (load_bool(self, Py_False) < 0)
4906 break;
4907 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004908 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004909 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004910 "invalid load key, '%s'.",
4911 "c", s[0]);
4912 return NULL;
4913 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004914
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004915 break;
4916 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004917
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004918 if ((err = PyErr_Occurred())) {
4919 if (err == PyExc_EOFError) {
4920 PyErr_SetNone(PyExc_EOFError);
4921 }
4922 return NULL;
4923 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004924
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004925 PDATA_POP(self->stack, val);
4926 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004927}
Tim Peters84e87f32001-03-17 04:50:51 +00004928
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004929
Guido van Rossum60456fd1997-04-09 17:36:32 +00004930static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004931Unpickler_load(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004932{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004933 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004934}
4935
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004936static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004937Unpickler_noload(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004938{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004939 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004940}
4941
Guido van Rossum60456fd1997-04-09 17:36:32 +00004942
4943static struct PyMethodDef Unpickler_methods[] = {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004944 {"load", (PyCFunction)Unpickler_load, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004945 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004946 },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004947 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004948 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004949 "noload() -- not load a pickle, but go through most of the motions\n"
4950 "\n"
4951 "This function can be used to read past a pickle without instantiating\n"
4952 "any objects or importing any modules. It can also be used to find all\n"
4953 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004954 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004955 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004956 {NULL, NULL} /* sentinel */
4957};
4958
4959
4960static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004961newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004962{
4963 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004964
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004965 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004966 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004967
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004968 self->file = NULL;
4969 self->arg = NULL;
4970 self->stack = (Pdata*)Pdata_New();
4971 self->pers_func = NULL;
4972 self->last_string = NULL;
4973 self->marks = NULL;
4974 self->num_marks = 0;
4975 self->marks_size = 0;
4976 self->buf_size = 0;
4977 self->read = NULL;
4978 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004979 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004980
Tim Peterscba30e22003-02-01 06:24:36 +00004981 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004982 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004983
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004984 if (!self->stack)
4985 goto err;
4986
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004987 Py_INCREF(f);
4988 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004989
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004990 /* Set read, readline based on type of f */
4991 if (PyFile_Check(f)) {
4992 self->fp = PyFile_AsFile(f);
4993 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00004994 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004995 "I/O operation on closed file");
4996 goto err;
4997 }
4998 self->read_func = read_file;
4999 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00005000 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005001 else if (PycStringIO_InputCheck(f)) {
5002 self->fp = NULL;
5003 self->read_func = read_cStringIO;
5004 self->readline_func = readline_cStringIO;
5005 }
5006 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00005007
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005008 self->fp = NULL;
5009 self->read_func = read_other;
5010 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005011
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005012 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
5013 (self->read = PyObject_GetAttr(f, read_str)))) {
5014 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00005015 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005016 "argument must have 'read' and "
5017 "'readline' attributes" );
5018 goto err;
5019 }
5020 }
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005021 PyObject_GC_Track(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005023 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005024
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005025 err:
5026 Py_DECREF((PyObject *)self);
5027 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005028}
5029
5030
5031static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005032get_Unpickler(PyObject *self, PyObject *file)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005033{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005034 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005035}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005036
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005037
Guido van Rossum60456fd1997-04-09 17:36:32 +00005038static void
Tim Peterscba30e22003-02-01 06:24:36 +00005039Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005040{
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005041 PyObject_GC_UnTrack((PyObject *)self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005042 Py_XDECREF(self->readline);
5043 Py_XDECREF(self->read);
5044 Py_XDECREF(self->file);
5045 Py_XDECREF(self->memo);
5046 Py_XDECREF(self->stack);
5047 Py_XDECREF(self->pers_func);
5048 Py_XDECREF(self->arg);
5049 Py_XDECREF(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00005050 Py_XDECREF(self->find_class);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005051
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005052 if (self->marks) {
5053 free(self->marks);
5054 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005055
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005056 if (self->buf_size) {
5057 free(self->buf);
5058 }
Tim Peters84e87f32001-03-17 04:50:51 +00005059
Tim Peters3cfe7542003-05-21 21:29:48 +00005060 self->ob_type->tp_free((PyObject *)self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005061}
5062
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005063static int
5064Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
5065{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005066 Py_VISIT(self->readline);
5067 Py_VISIT(self->read);
5068 Py_VISIT(self->file);
5069 Py_VISIT(self->memo);
5070 Py_VISIT(self->stack);
5071 Py_VISIT(self->pers_func);
5072 Py_VISIT(self->arg);
5073 Py_VISIT(self->last_string);
5074 Py_VISIT(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005075 return 0;
5076}
5077
5078static int
5079Unpickler_clear(Unpicklerobject *self)
5080{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005081 Py_CLEAR(self->readline);
5082 Py_CLEAR(self->read);
5083 Py_CLEAR(self->file);
5084 Py_CLEAR(self->memo);
5085 Py_CLEAR(self->stack);
5086 Py_CLEAR(self->pers_func);
5087 Py_CLEAR(self->arg);
5088 Py_CLEAR(self->last_string);
5089 Py_CLEAR(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005090 return 0;
5091}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005092
5093static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005094Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005095{
5096 if (!strcmp(name, "persistent_load")) {
5097 if (!self->pers_func) {
5098 PyErr_SetString(PyExc_AttributeError, name);
5099 return NULL;
5100 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005101
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005102 Py_INCREF(self->pers_func);
5103 return self->pers_func;
5104 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005105
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005106 if (!strcmp(name, "find_global")) {
5107 if (!self->find_class) {
5108 PyErr_SetString(PyExc_AttributeError, name);
5109 return NULL;
5110 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005111
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005112 Py_INCREF(self->find_class);
5113 return self->find_class;
5114 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005116 if (!strcmp(name, "memo")) {
5117 if (!self->memo) {
5118 PyErr_SetString(PyExc_AttributeError, name);
5119 return NULL;
5120 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005121
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005122 Py_INCREF(self->memo);
5123 return self->memo;
5124 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005125
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005126 if (!strcmp(name, "UnpicklingError")) {
5127 Py_INCREF(UnpicklingError);
5128 return UnpicklingError;
5129 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005131 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005132}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005133
Guido van Rossum60456fd1997-04-09 17:36:32 +00005134
5135static int
Tim Peterscba30e22003-02-01 06:24:36 +00005136Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005137{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005139 if (!strcmp(name, "persistent_load")) {
5140 Py_XDECREF(self->pers_func);
5141 self->pers_func = value;
5142 Py_XINCREF(value);
5143 return 0;
5144 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005145
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005146 if (!strcmp(name, "find_global")) {
5147 Py_XDECREF(self->find_class);
5148 self->find_class = value;
5149 Py_XINCREF(value);
5150 return 0;
5151 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005153 if (! value) {
5154 PyErr_SetString(PyExc_TypeError,
5155 "attribute deletion is not supported");
5156 return -1;
5157 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005159 if (strcmp(name, "memo") == 0) {
5160 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005161 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005162 "memo must be a dictionary");
5163 return -1;
5164 }
5165 Py_XDECREF(self->memo);
5166 self->memo = value;
5167 Py_INCREF(value);
5168 return 0;
5169 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005170
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005171 PyErr_SetString(PyExc_AttributeError, name);
5172 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005173}
5174
Tim Peters5bd2a792003-02-01 16:45:06 +00005175/* ---------------------------------------------------------------------------
5176 * Module-level functions.
5177 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005178
Martin v. Löwis544f1192004-07-27 05:22:33 +00005179/* dump(obj, file, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005180static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005181cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005182{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005183 static char *kwlist[] = {"obj", "file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005184 PyObject *ob, *file, *res = NULL;
5185 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005186 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005187
Martin v. Löwis544f1192004-07-27 05:22:33 +00005188 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5189 &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005190 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005191
Tim Peters5bd2a792003-02-01 16:45:06 +00005192 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005193 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005195 if (dump(pickler, ob) < 0)
5196 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005197
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005198 Py_INCREF(Py_None);
5199 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005200
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005201 finally:
5202 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005204 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005205}
5206
5207
Martin v. Löwis544f1192004-07-27 05:22:33 +00005208/* dumps(obj, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005209static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005210cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005211{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005212 static char *kwlist[] = {"obj", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005213 PyObject *ob, *file = 0, *res = NULL;
5214 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005215 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005216
Martin v. Löwis544f1192004-07-27 05:22:33 +00005217 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5218 &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005219 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005220
Tim Peterscba30e22003-02-01 06:24:36 +00005221 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005222 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005223
Tim Peters5bd2a792003-02-01 16:45:06 +00005224 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005225 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005226
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005227 if (dump(pickler, ob) < 0)
5228 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005229
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005230 res = PycStringIO->cgetvalue(file);
Guido van Rossumcfe5f202007-05-08 21:26:54 +00005231 if (res == NULL)
5232 goto finally;
5233 if (!PyBytes_Check(res)) {
5234 PyObject *tmp = res;
5235 res = PyBytes_FromObject(res);
5236 Py_DECREF(tmp);
5237 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00005238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005239 finally:
5240 Py_XDECREF(pickler);
5241 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005243 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005244}
5245
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005246
Tim Peters5bd2a792003-02-01 16:45:06 +00005247/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005248static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005249cpm_load(PyObject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005250{
5251 Unpicklerobject *unpickler = 0;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005252 PyObject *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005253
Tim Peterscba30e22003-02-01 06:24:36 +00005254 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005255 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005256
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005257 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005259 finally:
5260 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005261
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005262 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005263}
5264
5265
Tim Peters5bd2a792003-02-01 16:45:06 +00005266/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005267static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005268cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005269{
5270 PyObject *ob, *file = 0, *res = NULL;
5271 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005272
Guido van Rossum617dbc42007-05-07 23:57:08 +00005273 if (!( PyArg_ParseTuple(args, "S:loads", &ob))) {
5274 PyErr_Clear();
5275 if (!PyArg_ParseTuple(args, "Y:loads", &ob))
5276 goto finally;
5277 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005278
Tim Peterscba30e22003-02-01 06:24:36 +00005279 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005280 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005281
Tim Peterscba30e22003-02-01 06:24:36 +00005282 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005283 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005284
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005285 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005286
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005287 finally:
5288 Py_XDECREF(file);
5289 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005291 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005292}
5293
5294
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005295PyDoc_STRVAR(Unpicklertype__doc__,
5296"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005297
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005298static PyTypeObject Unpicklertype = {
5299 PyObject_HEAD_INIT(NULL)
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005300 0, /*ob_size*/
5301 "cPickle.Unpickler", /*tp_name*/
5302 sizeof(Unpicklerobject), /*tp_basicsize*/
5303 0,
5304 (destructor)Unpickler_dealloc, /* tp_dealloc */
5305 0, /* tp_print */
5306 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5307 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5308 0, /* tp_compare */
5309 0, /* tp_repr */
5310 0, /* tp_as_number */
5311 0, /* tp_as_sequence */
5312 0, /* tp_as_mapping */
5313 0, /* tp_hash */
5314 0, /* tp_call */
5315 0, /* tp_str */
5316 0, /* tp_getattro */
5317 0, /* tp_setattro */
5318 0, /* tp_as_buffer */
5319 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5320 Unpicklertype__doc__, /* tp_doc */
5321 (traverseproc)Unpickler_traverse, /* tp_traverse */
5322 (inquiry)Unpickler_clear, /* tp_clear */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005323};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005324
Guido van Rossum60456fd1997-04-09 17:36:32 +00005325static struct PyMethodDef cPickle_methods[] = {
Martin v. Löwis544f1192004-07-27 05:22:33 +00005326 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5327 PyDoc_STR("dump(obj, file, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005328 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005329 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005330 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005331 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005332
Martin v. Löwis544f1192004-07-27 05:22:33 +00005333 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5334 PyDoc_STR("dumps(obj, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005335 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005336 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005337 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005338 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005339
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005340 {"load", (PyCFunction)cpm_load, METH_O,
Neal Norwitz200788c2002-08-13 22:20:41 +00005341 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005342
Neal Norwitzb0493252002-03-31 14:44:22 +00005343 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005344 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005345
Martin v. Löwis544f1192004-07-27 05:22:33 +00005346 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5347 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005348 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005349 "This takes a file-like object for writing a pickle data stream.\n"
5350 "The optional proto argument tells the pickler to use the given\n"
5351 "protocol; supported protocols are 0, 1, 2. The default\n"
5352 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5353 "only protocol that can be written to a file opened in text\n"
5354 "mode and read back successfully. When using a protocol higher\n"
5355 "than 0, make sure the file is opened in binary mode, both when\n"
5356 "pickling and unpickling.)\n"
5357 "\n"
5358 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5359 "more efficient than protocol 1.\n"
5360 "\n"
5361 "Specifying a negative protocol version selects the highest\n"
5362 "protocol version supported. The higher the protocol used, the\n"
5363 "more recent the version of Python needed to read the pickle\n"
5364 "produced.\n"
5365 "\n"
5366 "The file parameter must have a write() method that accepts a single\n"
5367 "string argument. It can thus be an open file object, a StringIO\n"
5368 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005369 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005370
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005371 {"Unpickler", (PyCFunction)get_Unpickler, METH_O,
Tim Peters5bd2a792003-02-01 16:45:06 +00005372 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5373
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005374 { NULL, NULL }
5375};
5376
Guido van Rossum60456fd1997-04-09 17:36:32 +00005377static int
Tim Peterscba30e22003-02-01 06:24:36 +00005378init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005379{
5380 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005381
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00005382#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005383
Tim Peters3cfe7542003-05-21 21:29:48 +00005384 if (PyType_Ready(&Unpicklertype) < 0)
5385 return -1;
5386 if (PyType_Ready(&Picklertype) < 0)
5387 return -1;
5388
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005389 INIT_STR(__class__);
5390 INIT_STR(__getinitargs__);
5391 INIT_STR(__dict__);
5392 INIT_STR(__getstate__);
5393 INIT_STR(__setstate__);
5394 INIT_STR(__name__);
5395 INIT_STR(__main__);
5396 INIT_STR(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00005397 INIT_STR(__reduce_ex__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005398 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005399 INIT_STR(append);
5400 INIT_STR(read);
5401 INIT_STR(readline);
5402 INIT_STR(copy_reg);
5403 INIT_STR(dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005404
Tim Peterscba30e22003-02-01 06:24:36 +00005405 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005406 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005407
Tim Peters1f1b2d22003-02-01 02:16:37 +00005408 /* This is special because we want to use a different
5409 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005410 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005411 if (!dispatch_table) return -1;
5412
5413 extension_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005414 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005415 if (!extension_registry) return -1;
5416
5417 inverted_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005418 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005419 if (!inverted_registry) return -1;
5420
5421 extension_cache = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005422 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005423 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005425 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005426
Tim Peters731098b2003-02-04 20:56:09 +00005427 if (!(empty_tuple = PyTuple_New(0)))
5428 return -1;
5429
5430 two_tuple = PyTuple_New(2);
5431 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005432 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005433 /* We use this temp container with no regard to refcounts, or to
5434 * keeping containees alive. Exempt from GC, because we don't
5435 * want anything looking at two_tuple() by magic.
5436 */
5437 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005439 /* Ugh */
5440 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5441 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5442 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005443
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005444 if (!( t=PyDict_New())) return -1;
5445 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005446 "def __str__(self):\n"
5447 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5448 Py_file_input,
5449 module_dict, t) )) return -1;
5450 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005452 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005453 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005454 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005455
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005456 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005457
Tim Peterscba30e22003-02-01 06:24:36 +00005458 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005459 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005460 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005461 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005462
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005463 if (!( t=PyDict_New())) return -1;
5464 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005465 "def __str__(self):\n"
5466 " a=self.args\n"
5467 " a=a and type(a[0]) or '(what)'\n"
5468 " return 'Cannot pickle %s objects' % a\n"
5469 , Py_file_input,
5470 module_dict, t) )) return -1;
5471 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005473 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005474 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005475 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005476
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005477 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005478
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005479 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005480 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005481 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005482
Martin v. Löwis658009a2002-09-16 17:26:24 +00005483 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5484 UnpicklingError, NULL)))
5485 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005487 if (PyDict_SetItemString(module_dict, "PickleError",
5488 PickleError) < 0)
5489 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005491 if (PyDict_SetItemString(module_dict, "PicklingError",
5492 PicklingError) < 0)
5493 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005494
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005495 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5496 UnpicklingError) < 0)
5497 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005499 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5500 UnpickleableError) < 0)
5501 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005502
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005503 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5504 BadPickleGet) < 0)
5505 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005506
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005507 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005509 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005510}
5511
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005512#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5513#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005514#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005515PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005516initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005517{
5518 PyObject *m, *d, *di, *v, *k;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005519 Py_ssize_t i;
Tim Peters5b7da392003-02-04 00:21:07 +00005520 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005521 PyObject *format_version;
5522 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005524 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005525 Unpicklertype.ob_type = &PyType_Type;
5526 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005527
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005528 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005529 * so we're forced to use a temporary dictionary. :(
5530 */
5531 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005532 if (!di) return;
5533 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005534
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005535 /* Create the module and add the functions */
5536 m = Py_InitModule4("cPickle", cPickle_methods,
5537 cPickle_module_documentation,
5538 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00005539 if (m == NULL)
5540 return;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005542 /* Add some symbolic constants to the module */
5543 d = PyModule_GetDict(m);
Tim Peters5b7da392003-02-04 00:21:07 +00005544 v = PyString_FromString(rev);
5545 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005546 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005548 /* Copy data from di. Waaa. */
5549 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5550 if (PyObject_SetItem(d, k, v) < 0) {
5551 Py_DECREF(di);
5552 return;
5553 }
5554 }
5555 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005556
Tim Peters8587b3c2003-02-13 15:44:41 +00005557 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
5558 if (i < 0)
5559 return;
5560
Tim Peters5b7da392003-02-04 00:21:07 +00005561 /* These are purely informational; no code uses them. */
5562 /* File format version we write. */
5563 format_version = PyString_FromString("2.0");
5564 /* Format versions we can read. */
5565 compatible_formats = Py_BuildValue("[sssss]",
5566 "1.0", /* Original protocol 0 */
5567 "1.1", /* Protocol 0 + INST */
5568 "1.2", /* Original protocol 1 */
5569 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005570 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005571 PyDict_SetItemString(d, "format_version", format_version);
5572 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5573 Py_XDECREF(format_version);
5574 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005575}