blob: 537276c82cbad90b0a595c37784589a5f498bcf6 [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,
Neal Norwitzb183a252006-04-10 01:03:32 +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++) {
Neal Norwitzb59d08c2006-07-22 16:20:49 +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;
Neal Norwitzb59d08c2006-07-22 16:20:49 +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;
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000221 tmp = realloc(self->data, nbytes);
222 if (tmp == NULL)
Tim Peters1d63c9f2003-02-02 20:29:39 +0000223 goto nomemory;
Neal Norwitzb59d08c2006-07-22 16:20:49 +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) {
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +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 }
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +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;
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +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 }
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +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 }
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +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 }
717 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000718
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000719 if (!self->bin) {
720 s[0] = GET;
721 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
722 len = strlen(s);
723 }
724 else if (Pdata_Check(self->file)) {
725 if (write_other(self, NULL, 0) < 0) return -1;
726 PDATA_APPEND(self->file, mv, -1);
727 return 0;
728 }
729 else {
730 if (c_value < 256) {
731 s[0] = BINGET;
732 s[1] = (int)(c_value & 0xff);
733 len = 2;
734 }
735 else {
736 s[0] = LONG_BINGET;
737 s[1] = (int)(c_value & 0xff);
738 s[2] = (int)((c_value >> 8) & 0xff);
739 s[3] = (int)((c_value >> 16) & 0xff);
740 s[4] = (int)((c_value >> 24) & 0xff);
741 len = 5;
742 }
743 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000744
Tim Peters0bc93f52003-02-02 18:29:33 +0000745 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000746 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000747
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000748 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000749}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000750
Guido van Rossum60456fd1997-04-09 17:36:32 +0000751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000752static int
Tim Peterscba30e22003-02-01 06:24:36 +0000753put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000754{
Tim Peterscba30e22003-02-01 06:24:36 +0000755 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000756 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000758 return put2(self, ob);
759}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000760
Guido van Rossum053b8df1998-11-25 16:18:00 +0000761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000762static int
Tim Peterscba30e22003-02-01 06:24:36 +0000763put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000764{
765 char c_str[30];
766 int p;
767 size_t len;
768 int res = -1;
769 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000770
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000771 if (self->fast)
772 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000774 if ((p = PyDict_Size(self->memo)) < 0)
775 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000777 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000778 /* XXX Why?
779 * XXX And does "positive" really mean non-negative?
780 * XXX pickle.py starts with PUT index 0, not 1. This makes for
781 * XXX gratuitous differences between the pickling modules.
782 */
Tim Peterscba30e22003-02-01 06:24:36 +0000783 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000784
Tim Peterscba30e22003-02-01 06:24:36 +0000785 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000786 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000787
Tim Peterscba30e22003-02-01 06:24:36 +0000788 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000789 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000790
Tim Peterscba30e22003-02-01 06:24:36 +0000791 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000792 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000794 PyTuple_SET_ITEM(t, 0, memo_len);
795 Py_INCREF(memo_len);
796 PyTuple_SET_ITEM(t, 1, ob);
797 Py_INCREF(ob);
798
799 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
800 goto finally;
801
802 if (!self->bin) {
803 c_str[0] = PUT;
804 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
805 len = strlen(c_str);
806 }
807 else if (Pdata_Check(self->file)) {
808 if (write_other(self, NULL, 0) < 0) return -1;
809 PDATA_APPEND(self->file, memo_len, -1);
810 res=0; /* Job well done ;) */
811 goto finally;
812 }
813 else {
814 if (p >= 256) {
815 c_str[0] = LONG_BINPUT;
816 c_str[1] = (int)(p & 0xff);
817 c_str[2] = (int)((p >> 8) & 0xff);
818 c_str[3] = (int)((p >> 16) & 0xff);
819 c_str[4] = (int)((p >> 24) & 0xff);
820 len = 5;
821 }
822 else {
823 c_str[0] = BINPUT;
824 c_str[1] = p;
825 len = 2;
826 }
827 }
828
Tim Peters0bc93f52003-02-02 18:29:33 +0000829 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000830 goto finally;
831
832 res = 0;
833
834 finally:
835 Py_XDECREF(py_ob_id);
836 Py_XDECREF(memo_len);
837 Py_XDECREF(t);
838
839 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000840}
841
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000842static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000843whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000844{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000845 Py_ssize_t i, j;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000846 PyObject *module = 0, *modules_dict = 0,
847 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000849 module = PyObject_GetAttrString(global, "__module__");
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000850 if (module)
851 return module;
852 if (PyErr_ExceptionMatches(PyExc_AttributeError))
853 PyErr_Clear();
854 else
855 return NULL;
Guido van Rossum45188231997-09-28 05:38:51 +0000856
Tim Peterscba30e22003-02-01 06:24:36 +0000857 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000858 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000860 i = 0;
861 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000862
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000863 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000865 global_name_attr = PyObject_GetAttr(module, global_name);
866 if (!global_name_attr) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000867 if (PyErr_ExceptionMatches(PyExc_AttributeError))
868 PyErr_Clear();
869 else
870 return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000871 continue;
872 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000874 if (global_name_attr != global) {
875 Py_DECREF(global_name_attr);
876 continue;
877 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000879 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000880
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000881 break;
882 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000884 /* The following implements the rule in pickle.py added in 1.5
885 that used __main__ if no module is found. I don't actually
886 like this rule. jlf
887 */
888 if (!j) {
889 j=1;
890 name=__main___str;
891 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000892
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000893 Py_INCREF(name);
894 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000895}
896
897
Guido van Rossum60456fd1997-04-09 17:36:32 +0000898static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000899fast_save_enter(Picklerobject *self, PyObject *obj)
900{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000901 /* if fast_container < 0, we're doing an error exit. */
902 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
903 PyObject *key = NULL;
904 if (self->fast_memo == NULL) {
905 self->fast_memo = PyDict_New();
906 if (self->fast_memo == NULL) {
907 self->fast_container = -1;
908 return 0;
909 }
910 }
911 key = PyLong_FromVoidPtr(obj);
912 if (key == NULL)
913 return 0;
914 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000915 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000916 PyErr_Format(PyExc_ValueError,
Tim Peters92c8bb32003-02-13 23:00:26 +0000917 "fast mode: can't pickle cyclic objects "
918 "including object type %s at %p",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000919 obj->ob_type->tp_name, obj);
920 self->fast_container = -1;
921 return 0;
922 }
923 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000924 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000925 self->fast_container = -1;
926 return 0;
927 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000928 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000929 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000930 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000931}
932
Tim Peterscba30e22003-02-01 06:24:36 +0000933int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000934fast_save_leave(Picklerobject *self, PyObject *obj)
935{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000936 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
937 PyObject *key = PyLong_FromVoidPtr(obj);
938 if (key == NULL)
939 return 0;
940 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000941 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000942 return 0;
943 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000944 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000945 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000946 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000947}
948
949static int
Tim Peterscba30e22003-02-01 06:24:36 +0000950save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000951{
952 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000953 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000954 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000955
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000956 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000957}
958
Guido van Rossum77f6a652002-04-03 22:41:51 +0000959static int
Tim Peterscba30e22003-02-01 06:24:36 +0000960save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000961{
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000962 static const char *buf[2] = {FALSE, TRUE};
Guido van Rossume2763392002-04-05 19:30:08 +0000963 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000964 long l = PyInt_AS_LONG((PyIntObject *)args);
965
Tim Peters3c67d792003-02-02 17:59:11 +0000966 if (self->proto >= 2) {
967 char opcode = l ? NEWTRUE : NEWFALSE;
968 if (self->write_func(self, &opcode, 1) < 0)
969 return -1;
970 }
971 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000972 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000973 return 0;
974}
Tim Peters84e87f32001-03-17 04:50:51 +0000975
Guido van Rossum60456fd1997-04-09 17:36:32 +0000976static int
Tim Peterscba30e22003-02-01 06:24:36 +0000977save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000978{
979 char c_str[32];
980 long l = PyInt_AS_LONG((PyIntObject *)args);
981 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000983 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000984#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000985 || l > 0x7fffffffL
986 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000987#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000988 ) {
989 /* Text-mode pickle, or long too big to fit in the 4-byte
990 * signed BININT format: store as a string.
991 */
992 c_str[0] = INT;
993 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +0000994 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000995 return -1;
996 }
997 else {
998 /* Binary pickle and l fits in a signed 4-byte int. */
999 c_str[1] = (int)( l & 0xff);
1000 c_str[2] = (int)((l >> 8) & 0xff);
1001 c_str[3] = (int)((l >> 16) & 0xff);
1002 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001004 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1005 if (c_str[2] == 0) {
1006 c_str[0] = BININT1;
1007 len = 2;
1008 }
1009 else {
1010 c_str[0] = BININT2;
1011 len = 3;
1012 }
1013 }
1014 else {
1015 c_str[0] = BININT;
1016 len = 5;
1017 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001018
Tim Peters0bc93f52003-02-02 18:29:33 +00001019 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001020 return -1;
1021 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001023 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001024}
1025
1026
1027static int
Tim Peterscba30e22003-02-01 06:24:36 +00001028save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001029{
Armin Rigo4b63c212006-10-04 11:44:06 +00001030 Py_ssize_t size;
Tim Petersee1a53c2003-02-02 02:57:53 +00001031 int res = -1;
1032 PyObject *repr = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001034 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001035
Tim Petersee1a53c2003-02-02 02:57:53 +00001036 if (self->proto >= 2) {
1037 /* Linear-time pickling. */
1038 size_t nbits;
1039 size_t nbytes;
1040 unsigned char *pdata;
1041 char c_str[5];
1042 int i;
1043 int sign = _PyLong_Sign(args);
1044
1045 if (sign == 0) {
1046 /* It's 0 -- an empty bytestring. */
1047 c_str[0] = LONG1;
1048 c_str[1] = 0;
1049 i = self->write_func(self, c_str, 2);
1050 if (i < 0) goto finally;
1051 res = 0;
1052 goto finally;
1053 }
1054 nbits = _PyLong_NumBits(args);
1055 if (nbits == (size_t)-1 && PyErr_Occurred())
1056 goto finally;
1057 /* How many bytes do we need? There are nbits >> 3 full
1058 * bytes of data, and nbits & 7 leftover bits. If there
1059 * are any leftover bits, then we clearly need another
1060 * byte. Wnat's not so obvious is that we *probably*
1061 * need another byte even if there aren't any leftovers:
1062 * the most-significant bit of the most-significant byte
1063 * acts like a sign bit, and it's usually got a sense
1064 * opposite of the one we need. The exception is longs
1065 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1066 * its own 256's-complement, so has the right sign bit
1067 * even without the extra byte. That's a pain to check
1068 * for in advance, though, so we always grab an extra
1069 * byte at the start, and cut it back later if possible.
1070 */
1071 nbytes = (nbits >> 3) + 1;
Armin Rigo4b63c212006-10-04 11:44:06 +00001072 if (nbytes > INT_MAX) {
Tim Petersee1a53c2003-02-02 02:57:53 +00001073 PyErr_SetString(PyExc_OverflowError, "long too large "
1074 "to pickle");
1075 goto finally;
1076 }
1077 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
1078 if (repr == NULL) goto finally;
1079 pdata = (unsigned char *)PyString_AS_STRING(repr);
1080 i = _PyLong_AsByteArray((PyLongObject *)args,
1081 pdata, nbytes,
1082 1 /* little endian */, 1 /* signed */);
1083 if (i < 0) goto finally;
1084 /* If the long is negative, this may be a byte more than
1085 * needed. This is so iff the MSB is all redundant sign
1086 * bits.
1087 */
1088 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1089 (pdata[nbytes - 2] & 0x80) != 0)
1090 --nbytes;
1091
1092 if (nbytes < 256) {
1093 c_str[0] = LONG1;
1094 c_str[1] = (char)nbytes;
1095 size = 2;
1096 }
1097 else {
1098 c_str[0] = LONG4;
1099 size = (int)nbytes;
1100 for (i = 1; i < 5; i++) {
1101 c_str[i] = (char)(size & 0xff);
1102 size >>= 8;
1103 }
1104 size = 5;
1105 }
1106 i = self->write_func(self, c_str, size);
1107 if (i < 0) goto finally;
1108 i = self->write_func(self, (char *)pdata, (int)nbytes);
1109 if (i < 0) goto finally;
1110 res = 0;
1111 goto finally;
1112 }
1113
1114 /* proto < 2: write the repr and newline. This is quadratic-time
1115 * (in the number of digits), in both directions.
1116 */
Tim Peterscba30e22003-02-01 06:24:36 +00001117 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001118 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001120 if ((size = PyString_Size(repr)) < 0)
1121 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001122
Tim Peters0bc93f52003-02-02 18:29:33 +00001123 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001124 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001125
Tim Peters0bc93f52003-02-02 18:29:33 +00001126 if (self->write_func(self,
1127 PyString_AS_STRING((PyStringObject *)repr),
1128 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001129 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001130
Tim Peters0bc93f52003-02-02 18:29:33 +00001131 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001132 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001133
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001134 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001136 finally:
1137 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001138 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001139}
1140
1141
1142static int
Tim Peterscba30e22003-02-01 06:24:36 +00001143save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001144{
1145 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001147 if (self->bin) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001148 char str[9];
Tim Peters9905b942003-03-20 20:53:32 +00001149 str[0] = BINFLOAT;
1150 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001151 return -1;
Tim Peters0bc93f52003-02-02 18:29:33 +00001152 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001153 return -1;
1154 }
1155 else {
1156 char c_str[250];
1157 c_str[0] = FLOAT;
Georg Brandlde9b6242006-04-30 11:13:56 +00001158 PyOS_ascii_formatd(c_str + 1, sizeof(c_str) - 2, "%.17g", x);
1159 /* Extend the formatted string with a newline character */
1160 strcat(c_str, "\n");
Guido van Rossum60456fd1997-04-09 17:36:32 +00001161
Tim Peters0bc93f52003-02-02 18:29:33 +00001162 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001163 return -1;
1164 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001166 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001167}
1168
1169
1170static int
Tim Peterscba30e22003-02-01 06:24:36 +00001171save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001172{
1173 int size, len;
1174 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001175
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001176 if ((size = PyString_Size(args)) < 0)
1177 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001179 if (!self->bin) {
1180 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001182 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001183
Tim Peterscba30e22003-02-01 06:24:36 +00001184 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001185 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001186
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001187 if ((len = PyString_Size(repr)) < 0)
1188 goto err;
1189 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001190
Tim Peters0bc93f52003-02-02 18:29:33 +00001191 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001192 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001193
Tim Peters0bc93f52003-02-02 18:29:33 +00001194 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001195 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001196
Tim Peters0bc93f52003-02-02 18:29:33 +00001197 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001198 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001200 Py_XDECREF(repr);
1201 }
1202 else {
1203 int i;
1204 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001206 if ((size = PyString_Size(args)) < 0)
1207 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001208
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001209 if (size < 256) {
1210 c_str[0] = SHORT_BINSTRING;
1211 c_str[1] = size;
1212 len = 2;
1213 }
Armin Rigo4b63c212006-10-04 11:44:06 +00001214 else if (size <= INT_MAX) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001215 c_str[0] = BINSTRING;
1216 for (i = 1; i < 5; i++)
1217 c_str[i] = (int)(size >> ((i - 1) * 8));
1218 len = 5;
1219 }
Armin Rigo4b63c212006-10-04 11:44:06 +00001220 else
1221 return -1; /* string too large */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001222
Tim Peters0bc93f52003-02-02 18:29:33 +00001223 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001224 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001226 if (size > 128 && Pdata_Check(self->file)) {
1227 if (write_other(self, NULL, 0) < 0) return -1;
1228 PDATA_APPEND(self->file, args, -1);
1229 }
1230 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001231 if (self->write_func(self,
1232 PyString_AS_STRING(
1233 (PyStringObject *)args),
1234 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001235 return -1;
1236 }
1237 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001239 if (doput)
1240 if (put(self, args) < 0)
1241 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001243 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001245 err:
1246 Py_XDECREF(repr);
1247 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001248}
1249
1250
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001251#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001252/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1253 backslash and newline characters to \uXXXX escapes. */
1254static PyObject *
1255modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1256{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001257 PyObject *repr;
1258 char *p;
1259 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001260
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001261 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001263 repr = PyString_FromStringAndSize(NULL, 6 * size);
1264 if (repr == NULL)
1265 return NULL;
1266 if (size == 0)
1267 return repr;
1268
1269 p = q = PyString_AS_STRING(repr);
1270 while (size-- > 0) {
1271 Py_UNICODE ch = *s++;
1272 /* Map 16-bit characters to '\uxxxx' */
1273 if (ch >= 256 || ch == '\\' || ch == '\n') {
1274 *p++ = '\\';
1275 *p++ = 'u';
1276 *p++ = hexdigit[(ch >> 12) & 0xf];
1277 *p++ = hexdigit[(ch >> 8) & 0xf];
1278 *p++ = hexdigit[(ch >> 4) & 0xf];
1279 *p++ = hexdigit[ch & 15];
1280 }
1281 /* Copy everything else as-is */
1282 else
1283 *p++ = (char) ch;
1284 }
1285 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001286 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001287 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001288}
1289
1290
Guido van Rossum60456fd1997-04-09 17:36:32 +00001291static int
Tim Peterscba30e22003-02-01 06:24:36 +00001292save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001293{
Armin Rigo4b63c212006-10-04 11:44:06 +00001294 Py_ssize_t size, len;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001295 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001297 if (!PyUnicode_Check(args))
1298 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001300 if (!self->bin) {
1301 char *repr_str;
1302 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001304 repr = modified_EncodeRawUnicodeEscape(
1305 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001306 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001307 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001308
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001309 if ((len = PyString_Size(repr)) < 0)
1310 goto err;
1311 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001312
Tim Peters0bc93f52003-02-02 18:29:33 +00001313 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001314 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001315
Tim Peters0bc93f52003-02-02 18:29:33 +00001316 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001317 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001318
Tim Peters0bc93f52003-02-02 18:29:33 +00001319 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001320 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001322 Py_XDECREF(repr);
1323 }
1324 else {
1325 int i;
1326 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001327
Tim Peterscba30e22003-02-01 06:24:36 +00001328 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001329 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001331 if ((size = PyString_Size(repr)) < 0)
1332 goto err;
Armin Rigo4b63c212006-10-04 11:44:06 +00001333 if (size > INT_MAX)
1334 return -1; /* string too large */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001336 c_str[0] = BINUNICODE;
1337 for (i = 1; i < 5; i++)
1338 c_str[i] = (int)(size >> ((i - 1) * 8));
1339 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001340
Tim Peters0bc93f52003-02-02 18:29:33 +00001341 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001342 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001344 if (size > 128 && Pdata_Check(self->file)) {
1345 if (write_other(self, NULL, 0) < 0)
1346 goto err;
1347 PDATA_APPEND(self->file, repr, -1);
1348 }
1349 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001350 if (self->write_func(self, PyString_AS_STRING(repr),
1351 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001352 goto err;
1353 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001355 Py_DECREF(repr);
1356 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001358 if (doput)
1359 if (put(self, args) < 0)
1360 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001362 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001363
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001364 err:
1365 Py_XDECREF(repr);
1366 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001367}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001368#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001369
Tim Peters1d63c9f2003-02-02 20:29:39 +00001370/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1371static int
Tim Peters67920142003-02-05 03:46:17 +00001372store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001373{
1374 int i;
1375 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001376
Tim Peters1d63c9f2003-02-02 20:29:39 +00001377 assert(PyTuple_Size(t) == len);
1378
1379 for (i = 0; i < len; i++) {
1380 PyObject *element = PyTuple_GET_ITEM(t, i);
1381
1382 if (element == NULL)
1383 goto finally;
1384 if (save(self, element, 0) < 0)
1385 goto finally;
1386 }
1387 res = 0;
1388
1389 finally:
1390 return res;
1391}
1392
1393/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1394 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001395 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001396 * (a tuple can be reached from itself), and that requires some subtle
1397 * magic so that it works in all cases. IOW, this is a long routine.
1398 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001399static int
Tim Peterscba30e22003-02-01 06:24:36 +00001400save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001401{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001402 PyObject *py_tuple_id = NULL;
1403 int len, i;
1404 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001406 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001407 static char pop = POP;
1408 static char pop_mark = POP_MARK;
1409 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001411 if ((len = PyTuple_Size(args)) < 0)
1412 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001413
Tim Peters1d63c9f2003-02-02 20:29:39 +00001414 if (len == 0) {
1415 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001416
Tim Peters1d63c9f2003-02-02 20:29:39 +00001417 if (self->proto) {
1418 c_str[0] = EMPTY_TUPLE;
1419 len = 1;
1420 }
1421 else {
1422 c_str[0] = MARK;
1423 c_str[1] = TUPLE;
1424 len = 2;
1425 }
1426 if (self->write_func(self, c_str, len) >= 0)
1427 res = 0;
1428 /* Don't memoize an empty tuple. */
1429 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001430 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001431
Tim Peters1d63c9f2003-02-02 20:29:39 +00001432 /* A non-empty tuple. */
1433
1434 /* id(tuple) isn't in the memo now. If it shows up there after
1435 * saving the tuple elements, the tuple must be recursive, in
1436 * which case we'll pop everything we put on the stack, and fetch
1437 * its value from the memo.
1438 */
1439 py_tuple_id = PyLong_FromVoidPtr(args);
1440 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001441 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001442
Tim Peters1d63c9f2003-02-02 20:29:39 +00001443 if (len <= 3 && self->proto >= 2) {
1444 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001445 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001446 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001447 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001448 /* pop the len elements */
1449 for (i = 0; i < len; ++i)
1450 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001451 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001452 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001453 if (get(self, py_tuple_id) < 0)
1454 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001455 res = 0;
1456 goto finally;
1457 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001458 /* Not recursive. */
1459 if (self->write_func(self, len2opcode + len, 1) < 0)
1460 goto finally;
1461 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001462 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001463
Tim Peters1d63c9f2003-02-02 20:29:39 +00001464 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1465 * Generate MARK elt1 elt2 ... TUPLE
1466 */
1467 if (self->write_func(self, &MARKv, 1) < 0)
1468 goto finally;
1469
Tim Peters67920142003-02-05 03:46:17 +00001470 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001471 goto finally;
1472
1473 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1474 /* pop the stack stuff we pushed */
1475 if (self->bin) {
1476 if (self->write_func(self, &pop_mark, 1) < 0)
1477 goto finally;
1478 }
1479 else {
1480 /* Note that we pop one more than len, to remove
1481 * the MARK too.
1482 */
1483 for (i = 0; i <= len; i++)
1484 if (self->write_func(self, &pop, 1) < 0)
1485 goto finally;
1486 }
1487 /* fetch from memo */
1488 if (get(self, py_tuple_id) >= 0)
1489 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001490 goto finally;
1491 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001492
Tim Peters1d63c9f2003-02-02 20:29:39 +00001493 /* Not recursive. */
1494 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001495 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001496
Tim Peters1d63c9f2003-02-02 20:29:39 +00001497 memoize:
1498 if (put(self, args) >= 0)
1499 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001501 finally:
1502 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001503 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001504}
1505
Tim Peters1092d642003-02-11 21:06:20 +00001506/* iter is an iterator giving items, and we batch up chunks of
1507 * MARK item item ... item APPENDS
1508 * opcode sequences. Calling code should have arranged to first create an
1509 * empty list, or list-like object, for the APPENDS to operate on.
1510 * Returns 0 on success, <0 on error.
1511 */
1512static int
1513batch_list(Picklerobject *self, PyObject *iter)
1514{
1515 PyObject *obj;
1516 PyObject *slice[BATCHSIZE];
1517 int i, n;
1518
1519 static char append = APPEND;
1520 static char appends = APPENDS;
1521
1522 assert(iter != NULL);
1523
1524 if (self->proto == 0) {
1525 /* APPENDS isn't available; do one at a time. */
1526 for (;;) {
1527 obj = PyIter_Next(iter);
1528 if (obj == NULL) {
1529 if (PyErr_Occurred())
1530 return -1;
1531 break;
1532 }
1533 i = save(self, obj, 0);
1534 Py_DECREF(obj);
1535 if (i < 0)
1536 return -1;
1537 if (self->write_func(self, &append, 1) < 0)
1538 return -1;
Tim Peters1092d642003-02-11 21:06:20 +00001539 }
1540 return 0;
1541 }
1542
1543 /* proto > 0: write in batches of BATCHSIZE. */
1544 do {
1545 /* Get next group of (no more than) BATCHSIZE elements. */
1546 for (n = 0; n < BATCHSIZE; ++n) {
1547 obj = PyIter_Next(iter);
1548 if (obj == NULL) {
1549 if (PyErr_Occurred())
1550 goto BatchFailed;
1551 break;
1552 }
1553 slice[n] = obj;
1554 }
1555
1556 if (n > 1) {
1557 /* Pump out MARK, slice[0:n], APPENDS. */
1558 if (self->write_func(self, &MARKv, 1) < 0)
1559 goto BatchFailed;
1560 for (i = 0; i < n; ++i) {
1561 if (save(self, slice[i], 0) < 0)
1562 goto BatchFailed;
1563 }
1564 if (self->write_func(self, &appends, 1) < 0)
1565 goto BatchFailed;
1566 }
1567 else if (n == 1) {
1568 if (save(self, slice[0], 0) < 0)
1569 goto BatchFailed;
1570 if (self->write_func(self, &append, 1) < 0)
1571 goto BatchFailed;
1572 }
1573
1574 for (i = 0; i < n; ++i) {
1575 Py_DECREF(slice[i]);
1576 }
Tim Peters90975f12003-02-12 05:28:58 +00001577 } while (n == BATCHSIZE);
Tim Peters1092d642003-02-11 21:06:20 +00001578 return 0;
1579
1580BatchFailed:
1581 while (--n >= 0) {
1582 Py_DECREF(slice[n]);
1583 }
1584 return -1;
1585}
1586
Guido van Rossum60456fd1997-04-09 17:36:32 +00001587static int
Tim Peterscba30e22003-02-01 06:24:36 +00001588save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001589{
Tim Peters1092d642003-02-11 21:06:20 +00001590 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001591 char s[3];
Tim Peters1092d642003-02-11 21:06:20 +00001592 int len;
1593 PyObject *iter;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001594
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001595 if (self->fast && !fast_save_enter(self, args))
1596 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001597
Tim Peters1092d642003-02-11 21:06:20 +00001598 /* Create an empty list. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001599 if (self->bin) {
1600 s[0] = EMPTY_LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001601 len = 1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001602 }
1603 else {
1604 s[0] = MARK;
1605 s[1] = LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001606 len = 2;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001607 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001608
Tim Peters1092d642003-02-11 21:06:20 +00001609 if (self->write_func(self, s, len) < 0)
1610 goto finally;
1611
1612 /* Get list length, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001613 if ((len = PyList_Size(args)) < 0)
1614 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001615
Tim Peters1092d642003-02-11 21:06:20 +00001616 /* Memoize. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001617 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001618 if (put(self, args) >= 0)
1619 res = 0;
1620 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001621 }
Tim Peters90975f12003-02-12 05:28:58 +00001622 if (put2(self, args) < 0)
1623 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001624
Tim Peters1092d642003-02-11 21:06:20 +00001625 /* Materialize the list elements. */
1626 iter = PyObject_GetIter(args);
1627 if (iter == NULL)
1628 goto finally;
1629 res = batch_list(self, iter);
1630 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001631
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001632 finally:
1633 if (self->fast && !fast_save_leave(self, args))
1634 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001635
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001636 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001637}
1638
1639
Tim Peters42f08ac2003-02-11 22:43:24 +00001640/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1641 * MARK key value ... key value SETITEMS
1642 * opcode sequences. Calling code should have arranged to first create an
1643 * empty dict, or dict-like object, for the SETITEMS to operate on.
1644 * Returns 0 on success, <0 on error.
1645 *
1646 * This is very much like batch_list(). The difference between saving
1647 * elements directly, and picking apart two-tuples, is so long-winded at
1648 * the C level, though, that attempts to combine these routines were too
1649 * ugly to bear.
1650 */
1651static int
1652batch_dict(Picklerobject *self, PyObject *iter)
1653{
1654 PyObject *p;
1655 PyObject *slice[BATCHSIZE];
1656 int i, n;
1657
1658 static char setitem = SETITEM;
1659 static char setitems = SETITEMS;
1660
1661 assert(iter != NULL);
1662
1663 if (self->proto == 0) {
1664 /* SETITEMS isn't available; do one at a time. */
1665 for (;;) {
1666 p = PyIter_Next(iter);
1667 if (p == NULL) {
1668 if (PyErr_Occurred())
1669 return -1;
1670 break;
1671 }
1672 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1673 PyErr_SetString(PyExc_TypeError, "dict items "
1674 "iterator must return 2-tuples");
1675 return -1;
1676 }
1677 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1678 if (i >= 0)
1679 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1680 Py_DECREF(p);
1681 if (i < 0)
1682 return -1;
1683 if (self->write_func(self, &setitem, 1) < 0)
1684 return -1;
Tim Peters42f08ac2003-02-11 22:43:24 +00001685 }
1686 return 0;
1687 }
1688
1689 /* proto > 0: write in batches of BATCHSIZE. */
1690 do {
1691 /* Get next group of (no more than) BATCHSIZE elements. */
1692 for (n = 0; n < BATCHSIZE; ++n) {
1693 p = PyIter_Next(iter);
1694 if (p == NULL) {
1695 if (PyErr_Occurred())
1696 goto BatchFailed;
1697 break;
1698 }
1699 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1700 PyErr_SetString(PyExc_TypeError, "dict items "
1701 "iterator must return 2-tuples");
1702 goto BatchFailed;
1703 }
1704 slice[n] = p;
1705 }
1706
1707 if (n > 1) {
1708 /* Pump out MARK, slice[0:n], SETITEMS. */
1709 if (self->write_func(self, &MARKv, 1) < 0)
1710 goto BatchFailed;
1711 for (i = 0; i < n; ++i) {
1712 p = slice[i];
1713 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1714 goto BatchFailed;
1715 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1716 goto BatchFailed;
1717 }
1718 if (self->write_func(self, &setitems, 1) < 0)
1719 goto BatchFailed;
1720 }
1721 else if (n == 1) {
1722 p = slice[0];
1723 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1724 goto BatchFailed;
1725 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1726 goto BatchFailed;
1727 if (self->write_func(self, &setitem, 1) < 0)
1728 goto BatchFailed;
1729 }
1730
1731 for (i = 0; i < n; ++i) {
1732 Py_DECREF(slice[i]);
1733 }
Tim Peters90975f12003-02-12 05:28:58 +00001734 } while (n == BATCHSIZE);
Tim Peters42f08ac2003-02-11 22:43:24 +00001735 return 0;
1736
1737BatchFailed:
1738 while (--n >= 0) {
1739 Py_DECREF(slice[n]);
1740 }
1741 return -1;
1742}
1743
Guido van Rossum60456fd1997-04-09 17:36:32 +00001744static int
Tim Peterscba30e22003-02-01 06:24:36 +00001745save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001746{
Tim Peters42f08ac2003-02-11 22:43:24 +00001747 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001748 char s[3];
Tim Peters42f08ac2003-02-11 22:43:24 +00001749 int len;
1750 PyObject *iter;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001752 if (self->fast && !fast_save_enter(self, args))
1753 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001754
Tim Peters42f08ac2003-02-11 22:43:24 +00001755 /* Create an empty dict. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001756 if (self->bin) {
1757 s[0] = EMPTY_DICT;
1758 len = 1;
1759 }
1760 else {
1761 s[0] = MARK;
1762 s[1] = DICT;
1763 len = 2;
1764 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001765
Tim Peters0bc93f52003-02-02 18:29:33 +00001766 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001767 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001768
Tim Peters42f08ac2003-02-11 22:43:24 +00001769 /* Get dict size, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001770 if ((len = PyDict_Size(args)) < 0)
1771 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001773 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001774 if (put(self, args) >= 0)
1775 res = 0;
1776 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001777 }
Tim Peters90975f12003-02-12 05:28:58 +00001778 if (put2(self, args) < 0)
1779 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001780
Tim Peters42f08ac2003-02-11 22:43:24 +00001781 /* Materialize the dict items. */
1782 iter = PyObject_CallMethod(args, "iteritems", "()");
1783 if (iter == NULL)
1784 goto finally;
1785 res = batch_dict(self, iter);
1786 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001788 finally:
1789 if (self->fast && !fast_save_leave(self, args))
1790 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001792 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001793}
1794
1795
Tim Peters84e87f32001-03-17 04:50:51 +00001796static int
Tim Peterscba30e22003-02-01 06:24:36 +00001797save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001798{
1799 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1800 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1801 char *module_str, *name_str;
1802 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001804 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001806 if (self->fast && !fast_save_enter(self, args))
1807 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001808
Tim Peters0bc93f52003-02-02 18:29:33 +00001809 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001810 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001811
Tim Peterscba30e22003-02-01 06:24:36 +00001812 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001813 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001815 if (self->bin) {
1816 if (save(self, class, 0) < 0)
1817 goto finally;
1818 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001819
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001820 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1821 PyObject *element = 0;
1822 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001824 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00001825 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001826 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001828 if ((len = PyObject_Size(class_args)) < 0)
1829 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001831 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001832 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001833 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001835 if (save(self, element, 0) < 0) {
1836 Py_DECREF(element);
1837 goto finally;
1838 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001840 Py_DECREF(element);
1841 }
1842 }
1843 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00001844 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1845 PyErr_Clear();
1846 else
1847 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001848 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001850 if (!self->bin) {
1851 if (!( name = ((PyClassObject *)class)->cl_name )) {
1852 PyErr_SetString(PicklingError, "class has no name");
1853 goto finally;
1854 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001855
Tim Peterscba30e22003-02-01 06:24:36 +00001856 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001857 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001858
Tim Peters84e87f32001-03-17 04:50:51 +00001859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001860 if ((module_size = PyString_Size(module)) < 0 ||
1861 (name_size = PyString_Size(name)) < 0)
1862 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001864 module_str = PyString_AS_STRING((PyStringObject *)module);
1865 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001866
Tim Peters0bc93f52003-02-02 18:29:33 +00001867 if (self->write_func(self, &inst, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001868 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001869
Tim Peters0bc93f52003-02-02 18:29:33 +00001870 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001871 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001872
Tim Peters0bc93f52003-02-02 18:29:33 +00001873 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001874 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001875
Tim Peters0bc93f52003-02-02 18:29:33 +00001876 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001877 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001878
Tim Peters0bc93f52003-02-02 18:29:33 +00001879 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001880 goto finally;
1881 }
Tim Peters0bc93f52003-02-02 18:29:33 +00001882 else if (self->write_func(self, &obj, 1) < 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001883 goto finally;
1884 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001886 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1887 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00001888 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001889 goto finally;
1890 }
1891 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00001892 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1893 PyErr_Clear();
1894 else
1895 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001897 if (!( state = PyObject_GetAttr(args, __dict___str))) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00001898 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1899 PyErr_Clear();
1900 else
1901 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001902 res = 0;
1903 goto finally;
1904 }
1905 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001906
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001907 if (!PyDict_Check(state)) {
1908 if (put2(self, args) < 0)
1909 goto finally;
1910 }
1911 else {
1912 if (put(self, args) < 0)
1913 goto finally;
1914 }
Tim Peters84e87f32001-03-17 04:50:51 +00001915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001916 if (save(self, state, 0) < 0)
1917 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001918
Tim Peters0bc93f52003-02-02 18:29:33 +00001919 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001920 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001921
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001922 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001924 finally:
1925 if (self->fast && !fast_save_leave(self, args))
1926 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001927
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001928 Py_XDECREF(module);
1929 Py_XDECREF(class);
1930 Py_XDECREF(state);
1931 Py_XDECREF(getinitargs_func);
1932 Py_XDECREF(getstate_func);
1933 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001935 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001936}
1937
1938
Guido van Rossum60456fd1997-04-09 17:36:32 +00001939static int
Tim Peterscba30e22003-02-01 06:24:36 +00001940save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001941{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001942 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001943 char *name_str, *module_str;
1944 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001946 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001948 if (name) {
1949 global_name = name;
1950 Py_INCREF(global_name);
1951 }
1952 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001953 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001954 goto finally;
1955 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001956
Tim Peterscba30e22003-02-01 06:24:36 +00001957 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001958 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001959
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001960 if ((module_size = PyString_Size(module)) < 0 ||
1961 (name_size = PyString_Size(global_name)) < 0)
1962 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001964 module_str = PyString_AS_STRING((PyStringObject *)module);
1965 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001966
Guido van Rossum75bfd052002-12-24 18:10:07 +00001967 /* XXX This can be doing a relative import. Clearly it shouldn't,
1968 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001969 mod = PyImport_ImportModule(module_str);
1970 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001971 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001972 "Can't pickle %s: import of module %s "
1973 "failed",
1974 "OS", args, module);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001975 goto finally;
1976 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001977 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001978 if (klass == NULL) {
1979 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001980 "Can't pickle %s: attribute lookup %s.%s "
1981 "failed",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001982 "OSS", args, module, global_name);
1983 goto finally;
1984 }
1985 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001986 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001987 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00001988 "Can't pickle %s: it's not the same object "
1989 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001990 "OSS", args, module, global_name);
1991 goto finally;
1992 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001993 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001994
Tim Peters731098b2003-02-04 20:56:09 +00001995 if (self->proto >= 2) {
1996 /* See whether this is in the extension registry, and if
1997 * so generate an EXT opcode.
1998 */
1999 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00002000 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00002001 char c_str[5];
2002 int n;
2003
2004 PyTuple_SET_ITEM(two_tuple, 0, module);
2005 PyTuple_SET_ITEM(two_tuple, 1, global_name);
2006 py_code = PyDict_GetItem(extension_registry, two_tuple);
2007 if (py_code == NULL)
2008 goto gen_global; /* not registered */
2009
2010 /* Verify py_code has the right type and value. */
2011 if (!PyInt_Check(py_code)) {
2012 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00002013 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00002014 "OO", args, py_code);
2015 goto finally;
2016 }
2017 code = PyInt_AS_LONG(py_code);
2018 if (code <= 0 || code > 0x7fffffffL) {
2019 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
2020 "extension code %ld is out of range",
2021 "Ol", args, code);
2022 goto finally;
2023 }
2024
2025 /* Generate an EXT opcode. */
2026 if (code <= 0xff) {
2027 c_str[0] = EXT1;
2028 c_str[1] = (char)code;
2029 n = 2;
2030 }
2031 else if (code <= 0xffff) {
2032 c_str[0] = EXT2;
2033 c_str[1] = (char)(code & 0xff);
2034 c_str[2] = (char)((code >> 8) & 0xff);
2035 n = 3;
2036 }
2037 else {
2038 c_str[0] = EXT4;
2039 c_str[1] = (char)(code & 0xff);
2040 c_str[2] = (char)((code >> 8) & 0xff);
2041 c_str[3] = (char)((code >> 16) & 0xff);
2042 c_str[4] = (char)((code >> 24) & 0xff);
2043 n = 5;
2044 }
2045
2046 if (self->write_func(self, c_str, n) >= 0)
2047 res = 0;
2048 goto finally; /* and don't memoize */
2049 }
2050
2051 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00002052 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002053 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002054
Tim Peters0bc93f52003-02-02 18:29:33 +00002055 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002056 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002057
Tim Peters0bc93f52003-02-02 18:29:33 +00002058 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002059 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002060
Tim Peters0bc93f52003-02-02 18:29:33 +00002061 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002062 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002063
Tim Peters0bc93f52003-02-02 18:29:33 +00002064 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002065 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002066
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002067 if (put(self, args) < 0)
2068 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002069
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002070 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002072 finally:
2073 Py_XDECREF(module);
2074 Py_XDECREF(global_name);
2075 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002076
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002077 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002078}
2079
Guido van Rossum60456fd1997-04-09 17:36:32 +00002080static int
Tim Peterscba30e22003-02-01 06:24:36 +00002081save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002082{
2083 PyObject *pid = 0;
2084 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002085
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002086 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002088 Py_INCREF(args);
2089 ARG_TUP(self, args);
2090 if (self->arg) {
2091 pid = PyObject_Call(f, self->arg, NULL);
2092 FREE_ARG_TUP(self);
2093 }
2094 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002095
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002096 if (pid != Py_None) {
2097 if (!self->bin) {
2098 if (!PyString_Check(pid)) {
2099 PyErr_SetString(PicklingError,
2100 "persistent id must be string");
2101 goto finally;
2102 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002103
Tim Peters0bc93f52003-02-02 18:29:33 +00002104 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002105 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002107 if ((size = PyString_Size(pid)) < 0)
2108 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002109
Tim Peters0bc93f52003-02-02 18:29:33 +00002110 if (self->write_func(self,
2111 PyString_AS_STRING(
2112 (PyStringObject *)pid),
2113 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002114 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002115
Tim Peters0bc93f52003-02-02 18:29:33 +00002116 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002117 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002119 res = 1;
2120 goto finally;
2121 }
2122 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00002123 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002124 res = -1;
2125 else
2126 res = 1;
2127 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002129 goto finally;
2130 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002132 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002133
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002134 finally:
2135 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002136
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002137 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002138}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002139
Tim Peters71fcda52003-02-14 23:05:28 +00002140/* We're saving ob, and args is the 2-thru-5 tuple returned by the
2141 * appropriate __reduce__ method for ob.
2142 */
Tim Peters84e87f32001-03-17 04:50:51 +00002143static int
Tim Peters71fcda52003-02-14 23:05:28 +00002144save_reduce(Picklerobject *self, PyObject *args, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002145{
Tim Peters71fcda52003-02-14 23:05:28 +00002146 PyObject *callable;
2147 PyObject *argtup;
2148 PyObject *state = NULL;
2149 PyObject *listitems = NULL;
2150 PyObject *dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002151
Tim Peters71fcda52003-02-14 23:05:28 +00002152 int use_newobj = self->proto >= 2;
2153
2154 static char reduce = REDUCE;
2155 static char build = BUILD;
2156 static char newobj = NEWOBJ;
2157
2158 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
2159 &callable,
2160 &argtup,
2161 &state,
2162 &listitems,
2163 &dictitems))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002164 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002165
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002166 if (!PyTuple_Check(argtup)) {
2167 PyErr_SetString(PicklingError,
2168 "args from reduce() should be a tuple");
2169 return -1;
2170 }
2171
Tim Peters71fcda52003-02-14 23:05:28 +00002172 if (state == Py_None)
2173 state = NULL;
2174 if (listitems == Py_None)
2175 listitems = NULL;
2176 if (dictitems == Py_None)
2177 dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002178
Tim Peters71fcda52003-02-14 23:05:28 +00002179 /* Protocol 2 special case: if callable's name is __newobj__, use
2180 * NEWOBJ. This consumes a lot of code.
2181 */
2182 if (use_newobj) {
2183 PyObject *temp = PyObject_GetAttr(callable, __name___str);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002184
Tim Peters71fcda52003-02-14 23:05:28 +00002185 if (temp == NULL) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002186 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2187 PyErr_Clear();
2188 else
2189 return -1;
Tim Peters71fcda52003-02-14 23:05:28 +00002190 use_newobj = 0;
2191 }
2192 else {
2193 use_newobj = PyString_Check(temp) &&
2194 strcmp(PyString_AS_STRING(temp),
2195 "__newobj__") == 0;
2196 Py_DECREF(temp);
2197 }
2198 }
2199 if (use_newobj) {
2200 PyObject *cls;
2201 PyObject *newargtup;
2202 int n, i;
2203
2204 /* Sanity checks. */
2205 n = PyTuple_Size(argtup);
2206 if (n < 1) {
2207 PyErr_SetString(PicklingError, "__newobj__ arglist "
2208 "is empty");
2209 return -1;
2210 }
2211
2212 cls = PyTuple_GET_ITEM(argtup, 0);
2213 if (! PyObject_HasAttrString(cls, "__new__")) {
2214 PyErr_SetString(PicklingError, "args[0] from "
2215 "__newobj__ args has no __new__");
2216 return -1;
2217 }
2218
2219 /* XXX How could ob be NULL? */
2220 if (ob != NULL) {
2221 PyObject *ob_dot_class;
2222
2223 ob_dot_class = PyObject_GetAttr(ob, __class___str);
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002224 if (ob_dot_class == NULL) {
2225 if (PyErr_ExceptionMatches(
2226 PyExc_AttributeError))
2227 PyErr_Clear();
2228 else
2229 return -1;
2230 }
Tim Peters71fcda52003-02-14 23:05:28 +00002231 i = ob_dot_class != cls; /* true iff a problem */
2232 Py_XDECREF(ob_dot_class);
2233 if (i) {
2234 PyErr_SetString(PicklingError, "args[0] from "
2235 "__newobj__ args has the wrong class");
2236 return -1;
2237 }
2238 }
2239
2240 /* Save the class and its __new__ arguments. */
2241 if (save(self, cls, 0) < 0)
2242 return -1;
2243
2244 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2245 if (newargtup == NULL)
2246 return -1;
2247 for (i = 1; i < n; ++i) {
2248 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2249 Py_INCREF(temp);
2250 PyTuple_SET_ITEM(newargtup, i-1, temp);
2251 }
Neal Norwitzc9f22b92007-10-05 05:05:24 +00002252 i = save(self, newargtup, 0);
Tim Peters71fcda52003-02-14 23:05:28 +00002253 Py_DECREF(newargtup);
2254 if (i < 0)
2255 return -1;
2256
2257 /* Add NEWOBJ opcode. */
2258 if (self->write_func(self, &newobj, 1) < 0)
2259 return -1;
2260 }
2261 else {
2262 /* Not using NEWOBJ. */
2263 if (save(self, callable, 0) < 0 ||
2264 save(self, argtup, 0) < 0 ||
2265 self->write_func(self, &reduce, 1) < 0)
2266 return -1;
2267 }
2268
2269 /* Memoize. */
2270 /* XXX How can ob be NULL? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002271 if (ob != NULL) {
2272 if (state && !PyDict_Check(state)) {
2273 if (put2(self, ob) < 0)
2274 return -1;
2275 }
Tim Peters71fcda52003-02-14 23:05:28 +00002276 else if (put(self, ob) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002277 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002278 }
Tim Peters84e87f32001-03-17 04:50:51 +00002279
Guido van Rossum60456fd1997-04-09 17:36:32 +00002280
Tim Peters71fcda52003-02-14 23:05:28 +00002281 if (listitems && batch_list(self, listitems) < 0)
2282 return -1;
2283
2284 if (dictitems && batch_dict(self, dictitems) < 0)
2285 return -1;
2286
2287 if (state) {
2288 if (save(self, state, 0) < 0 ||
2289 self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002290 return -1;
2291 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002292
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002293 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002294}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002295
Guido van Rossum60456fd1997-04-09 17:36:32 +00002296static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002297save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002298{
2299 PyTypeObject *type;
Tim Peters71fcda52003-02-14 23:05:28 +00002300 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
2301 PyObject *arg_tup;
2302 int res = -1;
2303 int tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002304
Martin v. Löwis5a395302002-08-04 08:20:23 +00002305 if (self->nesting++ > Py_GetRecursionLimit()){
2306 PyErr_SetString(PyExc_RuntimeError,
2307 "maximum recursion depth exceeded");
2308 goto finally;
2309 }
2310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002311 if (!pers_save && self->pers_func) {
2312 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2313 res = tmp;
2314 goto finally;
2315 }
2316 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002317
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002318 if (args == Py_None) {
2319 res = save_none(self, args);
2320 goto finally;
2321 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002322
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002323 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002324
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002325 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002326 case 'b':
2327 if (args == Py_False || args == Py_True) {
2328 res = save_bool(self, args);
2329 goto finally;
2330 }
2331 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002332 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002333 if (type == &PyInt_Type) {
2334 res = save_int(self, args);
2335 goto finally;
2336 }
2337 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002338
Guido van Rossum60456fd1997-04-09 17:36:32 +00002339 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002340 if (type == &PyLong_Type) {
2341 res = save_long(self, args);
2342 goto finally;
2343 }
2344 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002345
Guido van Rossum60456fd1997-04-09 17:36:32 +00002346 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002347 if (type == &PyFloat_Type) {
2348 res = save_float(self, args);
2349 goto finally;
2350 }
2351 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002352
Guido van Rossum60456fd1997-04-09 17:36:32 +00002353 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002354 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2355 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002356 goto finally;
2357 }
2358 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002359
Guido van Rossum60456fd1997-04-09 17:36:32 +00002360 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002361 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2362 res = save_string(self, args, 0);
2363 goto finally;
2364 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002365
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002366#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002367 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002368 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2369 res = save_unicode(self, args, 0);
2370 goto finally;
2371 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002372#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002373 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002374
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002375 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002376 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002377 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002378
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002379 if (PyDict_GetItem(self->memo, py_ob_id)) {
2380 if (get(self, py_ob_id) < 0)
2381 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002383 res = 0;
2384 goto finally;
2385 }
2386 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002387
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002388 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002389 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002390 if (type == &PyString_Type) {
2391 res = save_string(self, args, 1);
2392 goto finally;
2393 }
2394 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002395
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002396#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002397 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002398 if (type == &PyUnicode_Type) {
2399 res = save_unicode(self, args, 1);
2400 goto finally;
2401 }
2402 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002403#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002404
Guido van Rossum60456fd1997-04-09 17:36:32 +00002405 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002406 if (type == &PyTuple_Type) {
2407 res = save_tuple(self, args);
2408 goto finally;
2409 }
2410 if (type == &PyType_Type) {
2411 res = save_global(self, args, NULL);
2412 goto finally;
2413 }
2414 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002415
Guido van Rossum60456fd1997-04-09 17:36:32 +00002416 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002417 if (type == &PyList_Type) {
2418 res = save_list(self, args);
2419 goto finally;
2420 }
2421 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002422
2423 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002424 if (type == &PyDict_Type) {
2425 res = save_dict(self, args);
2426 goto finally;
2427 }
2428 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002429
2430 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002431 if (type == &PyInstance_Type) {
2432 res = save_inst(self, args);
2433 goto finally;
2434 }
2435 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002436
2437 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002438 if (type == &PyClass_Type) {
2439 res = save_global(self, args, NULL);
2440 goto finally;
2441 }
2442 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002443
2444 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002445 if (type == &PyFunction_Type) {
2446 res = save_global(self, args, NULL);
Christian Tismer2460c622004-02-26 16:21:45 +00002447 if (res && PyErr_ExceptionMatches(PickleError)) {
2448 /* fall back to reduce */
2449 PyErr_Clear();
2450 break;
2451 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002452 goto finally;
2453 }
2454 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002455
2456 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002457 if (type == &PyCFunction_Type) {
2458 res = save_global(self, args, NULL);
2459 goto finally;
2460 }
2461 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002462
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002463 if (!pers_save && self->inst_pers_func) {
2464 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2465 res = tmp;
2466 goto finally;
2467 }
2468 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002469
Jeremy Hylton39c61162002-07-16 19:47:43 +00002470 if (PyType_IsSubtype(type, &PyType_Type)) {
2471 res = save_global(self, args, NULL);
2472 goto finally;
2473 }
2474
Guido van Rossumb289b872003-02-19 01:45:13 +00002475 /* Get a reduction callable, and call it. This may come from
2476 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
2477 * or the object's __reduce__ method.
Tim Peters71fcda52003-02-14 23:05:28 +00002478 */
Tim Peters5aa3da62003-02-13 21:03:57 +00002479 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2480 if (__reduce__ != NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002481 Py_INCREF(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00002482 Py_INCREF(args);
2483 ARG_TUP(self, args);
2484 if (self->arg) {
2485 t = PyObject_Call(__reduce__, self->arg, NULL);
2486 FREE_ARG_TUP(self);
2487 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002488 }
2489 else {
Guido van Rossumb289b872003-02-19 01:45:13 +00002490 /* Check for a __reduce_ex__ method. */
2491 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2492 if (__reduce__ != NULL) {
2493 t = PyInt_FromLong(self->proto);
2494 if (t != NULL) {
2495 ARG_TUP(self, t);
2496 t = NULL;
2497 if (self->arg) {
2498 t = PyObject_Call(__reduce__,
2499 self->arg, NULL);
2500 FREE_ARG_TUP(self);
2501 }
2502 }
2503 }
2504 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002505 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2506 PyErr_Clear();
2507 else
2508 goto finally;
Guido van Rossumb289b872003-02-19 01:45:13 +00002509 /* Check for a __reduce__ method. */
2510 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2511 if (__reduce__ != NULL) {
2512 t = PyObject_Call(__reduce__,
2513 empty_tuple, NULL);
2514 }
2515 else {
2516 PyErr_SetObject(UnpickleableError, args);
2517 goto finally;
2518 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002519 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002520 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002521
Tim Peters71fcda52003-02-14 23:05:28 +00002522 if (t == NULL)
2523 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002524
Tim Peters71fcda52003-02-14 23:05:28 +00002525 if (PyString_Check(t)) {
2526 res = save_global(self, args, t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002527 goto finally;
2528 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002529
Tim Peters71fcda52003-02-14 23:05:28 +00002530 if (! PyTuple_Check(t)) {
2531 cPickle_ErrFormat(PicklingError, "Value returned by "
2532 "%s must be string or tuple",
2533 "O", __reduce__);
2534 goto finally;
2535 }
2536
2537 size = PyTuple_Size(t);
2538 if (size < 2 || size > 5) {
2539 cPickle_ErrFormat(PicklingError, "tuple returned by "
2540 "%s must contain 2 through 5 elements",
2541 "O", __reduce__);
2542 goto finally;
2543 }
2544
2545 arg_tup = PyTuple_GET_ITEM(t, 1);
2546 if (!(PyTuple_Check(arg_tup) || arg_tup == Py_None)) {
2547 cPickle_ErrFormat(PicklingError, "Second element of "
2548 "tuple returned by %s must be a tuple",
2549 "O", __reduce__);
2550 goto finally;
2551 }
2552
2553 res = save_reduce(self, t, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002555 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002556 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002557 Py_XDECREF(py_ob_id);
2558 Py_XDECREF(__reduce__);
2559 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002561 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002562}
2563
2564
2565static int
Tim Peterscba30e22003-02-01 06:24:36 +00002566dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002567{
2568 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002569
Tim Peters4190fb82003-02-02 16:09:05 +00002570 if (self->proto >= 2) {
2571 char bytes[2];
2572
2573 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002574 assert(self->proto >= 0 && self->proto < 256);
2575 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002576 if (self->write_func(self, bytes, 2) < 0)
2577 return -1;
2578 }
2579
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002580 if (save(self, args, 0) < 0)
2581 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002582
Tim Peters4190fb82003-02-02 16:09:05 +00002583 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002584 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002585
Tim Peters4190fb82003-02-02 16:09:05 +00002586 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002587 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002589 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002590}
2591
2592static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002593Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002594{
Tim Peterscba30e22003-02-01 06:24:36 +00002595 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002596 PyDict_Clear(self->memo);
2597 Py_INCREF(Py_None);
2598 return Py_None;
2599}
2600
2601static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002602Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002603{
2604 int l, i, rsize, ssize, clear=1, lm;
2605 long ik;
2606 PyObject *k, *r;
2607 char *s, *p, *have_get;
2608 Pdata *data;
2609
2610 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002611 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002612 return NULL;
2613
2614 /* Check to make sure we are based on a list */
2615 if (! Pdata_Check(self->file)) {
2616 PyErr_SetString(PicklingError,
2617 "Attempt to getvalue() a non-list-based pickler");
2618 return NULL;
2619 }
2620
2621 /* flush write buffer */
2622 if (write_other(self, NULL, 0) < 0) return NULL;
2623
2624 data=(Pdata*)self->file;
2625 l=data->length;
2626
2627 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002628 lm = PyDict_Size(self->memo);
2629 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002630 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002631 have_get = malloc(lm);
2632 if (have_get == NULL) return PyErr_NoMemory();
2633 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002634
2635 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002636 for (rsize = 0, i = l; --i >= 0; ) {
2637 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002638
Tim Petersac5687a2003-02-02 18:08:34 +00002639 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002640 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002641
2642 else if (PyInt_Check(k)) { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002643 ik = PyInt_AS_LONG((PyIntObject*)k);
2644 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002645 PyErr_SetString(PicklingError,
2646 "Invalid get data");
Neal Norwitz98a96002006-07-23 07:57:11 +00002647 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002648 }
Tim Petersac5687a2003-02-02 18:08:34 +00002649 if (have_get[ik]) /* with matching get */
2650 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002651 }
2652
2653 else if (! (PyTuple_Check(k) &&
2654 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002655 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002656 ) {
2657 PyErr_SetString(PicklingError,
2658 "Unexpected data in internal list");
Neal Norwitz98a96002006-07-23 07:57:11 +00002659 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002660 }
2661
2662 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002663 ik = PyInt_AS_LONG((PyIntObject *)k);
2664 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002665 PyErr_SetString(PicklingError,
2666 "Invalid get data");
2667 return NULL;
2668 }
Tim Petersac5687a2003-02-02 18:08:34 +00002669 have_get[ik] = 1;
2670 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002671 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002672 }
2673
2674 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002675 r = PyString_FromStringAndSize(NULL, rsize);
2676 if (r == NULL) goto err;
2677 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002678
Tim Petersac5687a2003-02-02 18:08:34 +00002679 for (i = 0; i < l; i++) {
2680 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002681
2682 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002683 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002684 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002685 p=PyString_AS_STRING((PyStringObject *)k);
2686 while (--ssize >= 0)
2687 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002688 }
2689 }
2690
2691 else if (PyTuple_Check(k)) { /* get */
Tim Petersac5687a2003-02-02 18:08:34 +00002692 ik = PyInt_AS_LONG((PyIntObject *)
2693 PyTuple_GET_ITEM(k, 0));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002694 if (ik < 256) {
2695 *s++ = BINGET;
2696 *s++ = (int)(ik & 0xff);
2697 }
2698 else {
2699 *s++ = LONG_BINGET;
2700 *s++ = (int)(ik & 0xff);
2701 *s++ = (int)((ik >> 8) & 0xff);
2702 *s++ = (int)((ik >> 16) & 0xff);
2703 *s++ = (int)((ik >> 24) & 0xff);
2704 }
2705 }
2706
2707 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002708 ik = PyInt_AS_LONG((PyIntObject*)k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002709
2710 if (have_get[ik]) { /* with matching get */
2711 if (ik < 256) {
2712 *s++ = BINPUT;
2713 *s++ = (int)(ik & 0xff);
2714 }
2715 else {
2716 *s++ = LONG_BINPUT;
2717 *s++ = (int)(ik & 0xff);
2718 *s++ = (int)((ik >> 8) & 0xff);
2719 *s++ = (int)((ik >> 16) & 0xff);
2720 *s++ = (int)((ik >> 24) & 0xff);
2721 }
2722 }
2723 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002724 }
2725
2726 if (clear) {
2727 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002728 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002729 }
2730
2731 free(have_get);
2732 return r;
2733 err:
2734 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002735 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002736}
2737
2738static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002739Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002740{
2741 PyObject *ob;
2742 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002743
Tim Peterscba30e22003-02-01 06:24:36 +00002744 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002745 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002747 if (dump(self, ob) < 0)
2748 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002750 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002752 /* XXX Why does dump() return self? */
2753 Py_INCREF(self);
2754 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002755}
2756
2757
Tim Peterscba30e22003-02-01 06:24:36 +00002758static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002759{
Neal Norwitzb0493252002-03-31 14:44:22 +00002760 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002761 PyDoc_STR("dump(object) -- "
2762 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002763 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002764 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002765 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002766 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002767 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002768};
2769
2770
2771static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002772newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002773{
2774 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002775
Tim Peters5bd2a792003-02-01 16:45:06 +00002776 if (proto < 0)
Tim Peters8587b3c2003-02-13 15:44:41 +00002777 proto = HIGHEST_PROTOCOL;
2778 if (proto > HIGHEST_PROTOCOL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002779 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2780 "the highest available protocol is %d",
Tim Peters8587b3c2003-02-13 15:44:41 +00002781 proto, HIGHEST_PROTOCOL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002782 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002783 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002784
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002785 self = PyObject_GC_New(Picklerobject, &Picklertype);
Tim Peters5bd2a792003-02-01 16:45:06 +00002786 if (self == NULL)
2787 return NULL;
2788 self->proto = proto;
2789 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002790 self->fp = NULL;
2791 self->write = NULL;
2792 self->memo = NULL;
2793 self->arg = NULL;
2794 self->pers_func = NULL;
2795 self->inst_pers_func = NULL;
2796 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002797 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002798 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002799 self->fast_container = 0;
2800 self->fast_memo = NULL;
2801 self->buf_size = 0;
2802 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002803
Tim Peters5bd2a792003-02-01 16:45:06 +00002804 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002805 if (file)
2806 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002807 else {
2808 file = Pdata_New();
2809 if (file == NULL)
2810 goto err;
2811 }
2812 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002813
Tim Peterscba30e22003-02-01 06:24:36 +00002814 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002815 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002817 if (PyFile_Check(file)) {
2818 self->fp = PyFile_AsFile(file);
2819 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002820 PyErr_SetString(PyExc_ValueError,
2821 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002822 goto err;
2823 }
2824 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002825 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002826 else if (PycStringIO_OutputCheck(file)) {
2827 self->write_func = write_cStringIO;
2828 }
2829 else if (file == Py_None) {
2830 self->write_func = write_none;
2831 }
2832 else {
2833 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002835 if (! Pdata_Check(file)) {
2836 self->write = PyObject_GetAttr(file, write_str);
2837 if (!self->write) {
2838 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002839 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002840 "argument must have 'write' "
2841 "attribute");
2842 goto err;
2843 }
2844 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002845
Tim Peters5bd2a792003-02-01 16:45:06 +00002846 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2847 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002848 PyErr_NoMemory();
2849 goto err;
2850 }
2851 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002852
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002853 if (PyEval_GetRestricted()) {
2854 /* Restricted execution, get private tables */
Tim Peters5b7da392003-02-04 00:21:07 +00002855 PyObject *m = PyImport_Import(copy_reg_str);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002856
Tim Peters5b7da392003-02-04 00:21:07 +00002857 if (m == NULL)
2858 goto err;
2859 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002860 Py_DECREF(m);
Tim Peters5b7da392003-02-04 00:21:07 +00002861 if (self->dispatch_table == NULL)
2862 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002863 }
2864 else {
Tim Peters5b7da392003-02-04 00:21:07 +00002865 self->dispatch_table = dispatch_table;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002866 Py_INCREF(dispatch_table);
2867 }
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002868 PyObject_GC_Track(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002869
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002870 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002871
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002872 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002873 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002874 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002875}
2876
2877
2878static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00002879get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002880{
Martin v. Löwis15e62742006-02-27 16:46:16 +00002881 static char *kwlist[] = {"file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002882 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002883 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002884
Tim Peters92c8bb32003-02-13 23:00:26 +00002885 /* XXX
Martin v. Löwis544f1192004-07-27 05:22:33 +00002886 * The documented signature is Pickler(file, protocol=0), but this
Tim Peters92c8bb32003-02-13 23:00:26 +00002887 * accepts Pickler() and Pickler(integer) too. The meaning then
2888 * is clear as mud, undocumented, and not supported by pickle.py.
2889 * I'm told Zope uses this, but I haven't traced into this code
2890 * far enough to figure out what it means.
Tim Peters5bd2a792003-02-01 16:45:06 +00002891 */
2892 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002893 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002894 proto = 0;
Martin v. Löwis544f1192004-07-27 05:22:33 +00002895 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
2896 kwlist, &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002897 return NULL;
2898 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002899 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002900}
2901
2902
2903static void
Tim Peterscba30e22003-02-01 06:24:36 +00002904Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002905{
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002906 PyObject_GC_UnTrack(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002907 Py_XDECREF(self->write);
2908 Py_XDECREF(self->memo);
2909 Py_XDECREF(self->fast_memo);
2910 Py_XDECREF(self->arg);
2911 Py_XDECREF(self->file);
2912 Py_XDECREF(self->pers_func);
2913 Py_XDECREF(self->inst_pers_func);
2914 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002915 PyMem_Free(self->write_buf);
Tim Peters3cfe7542003-05-21 21:29:48 +00002916 self->ob_type->tp_free((PyObject *)self);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002917}
2918
2919static int
2920Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
2921{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002922 Py_VISIT(self->write);
2923 Py_VISIT(self->memo);
2924 Py_VISIT(self->fast_memo);
2925 Py_VISIT(self->arg);
2926 Py_VISIT(self->file);
2927 Py_VISIT(self->pers_func);
2928 Py_VISIT(self->inst_pers_func);
2929 Py_VISIT(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002930 return 0;
2931}
2932
2933static int
2934Pickler_clear(Picklerobject *self)
2935{
Thomas Woutersedf17d82006-04-15 17:28:34 +00002936 Py_CLEAR(self->write);
2937 Py_CLEAR(self->memo);
2938 Py_CLEAR(self->fast_memo);
2939 Py_CLEAR(self->arg);
2940 Py_CLEAR(self->file);
2941 Py_CLEAR(self->pers_func);
2942 Py_CLEAR(self->inst_pers_func);
2943 Py_CLEAR(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002944 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002945}
2946
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002947static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002948Pickler_get_pers_func(Picklerobject *p)
2949{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002950 if (p->pers_func == NULL)
2951 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2952 else
2953 Py_INCREF(p->pers_func);
2954 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002955}
2956
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002957static int
2958Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2959{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002960 if (v == NULL) {
2961 PyErr_SetString(PyExc_TypeError,
2962 "attribute deletion is not supported");
2963 return -1;
2964 }
2965 Py_XDECREF(p->pers_func);
2966 Py_INCREF(v);
2967 p->pers_func = v;
2968 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002969}
2970
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002971static int
2972Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2973{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002974 if (v == NULL) {
2975 PyErr_SetString(PyExc_TypeError,
2976 "attribute deletion is not supported");
2977 return -1;
2978 }
2979 Py_XDECREF(p->inst_pers_func);
2980 Py_INCREF(v);
2981 p->inst_pers_func = v;
2982 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002983}
2984
2985static PyObject *
2986Pickler_get_memo(Picklerobject *p)
2987{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002988 if (p->memo == NULL)
2989 PyErr_SetString(PyExc_AttributeError, "memo");
2990 else
2991 Py_INCREF(p->memo);
2992 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002993}
2994
2995static int
2996Pickler_set_memo(Picklerobject *p, PyObject *v)
2997{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002998 if (v == NULL) {
2999 PyErr_SetString(PyExc_TypeError,
3000 "attribute deletion is not supported");
3001 return -1;
3002 }
3003 if (!PyDict_Check(v)) {
3004 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
3005 return -1;
3006 }
3007 Py_XDECREF(p->memo);
3008 Py_INCREF(v);
3009 p->memo = v;
3010 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003011}
3012
3013static PyObject *
3014Pickler_get_error(Picklerobject *p)
3015{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003016 /* why is this an attribute on the Pickler? */
3017 Py_INCREF(PicklingError);
3018 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003019}
3020
3021static PyMemberDef Pickler_members[] = {
3022 {"binary", T_INT, offsetof(Picklerobject, bin)},
3023 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00003024 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003025};
3026
3027static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00003028 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003029 (setter)Pickler_set_pers_func},
3030 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
3031 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00003032 {"PicklingError", (getter)Pickler_get_error, NULL},
3033 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003034};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003035
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003036PyDoc_STRVAR(Picklertype__doc__,
3037"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003038
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003039static PyTypeObject Picklertype = {
3040 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00003041 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00003042 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003043 sizeof(Picklerobject), /*tp_basicsize*/
3044 0,
3045 (destructor)Pickler_dealloc, /* tp_dealloc */
3046 0, /* tp_print */
3047 0, /* tp_getattr */
3048 0, /* tp_setattr */
3049 0, /* tp_compare */
3050 0, /* tp_repr */
3051 0, /* tp_as_number */
3052 0, /* tp_as_sequence */
3053 0, /* tp_as_mapping */
3054 0, /* tp_hash */
3055 0, /* tp_call */
3056 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00003057 PyObject_GenericGetAttr, /* tp_getattro */
3058 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003059 0, /* tp_as_buffer */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003060 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003061 Picklertype__doc__, /* tp_doc */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003062 (traverseproc)Pickler_traverse, /* tp_traverse */
3063 (inquiry)Pickler_clear, /* tp_clear */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003064 0, /* tp_richcompare */
3065 0, /* tp_weaklistoffset */
3066 0, /* tp_iter */
3067 0, /* tp_iternext */
3068 Pickler_methods, /* tp_methods */
3069 Pickler_members, /* tp_members */
3070 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003071};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003072
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003073static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003074find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003075{
3076 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003077
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003078 if (fc) {
3079 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00003080 PyErr_SetString(UnpicklingError, "Global and instance "
3081 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003082 return NULL;
3083 }
Georg Brandl684fd0c2006-05-25 19:15:31 +00003084 return PyObject_CallFunctionObjArgs(fc, py_module_name,
3085 py_global_name, NULL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003086 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00003087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003088 module = PySys_GetObject("modules");
3089 if (module == NULL)
3090 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00003091
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003092 module = PyDict_GetItem(module, py_module_name);
3093 if (module == NULL) {
3094 module = PyImport_Import(py_module_name);
3095 if (!module)
3096 return NULL;
3097 global = PyObject_GetAttr(module, py_global_name);
3098 Py_DECREF(module);
3099 }
3100 else
3101 global = PyObject_GetAttr(module, py_global_name);
3102 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003103}
3104
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003105static int
Tim Peterscba30e22003-02-01 06:24:36 +00003106marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003107{
3108 if (self->num_marks < 1) {
3109 PyErr_SetString(UnpicklingError, "could not find MARK");
3110 return -1;
3111 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003112
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003113 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003114}
3115
Tim Peters84e87f32001-03-17 04:50:51 +00003116
Guido van Rossum60456fd1997-04-09 17:36:32 +00003117static int
Tim Peterscba30e22003-02-01 06:24:36 +00003118load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003119{
3120 PDATA_APPEND(self->stack, Py_None, -1);
3121 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003122}
3123
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003124static int
Tim Peterscba30e22003-02-01 06:24:36 +00003125bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003126{
3127 PyErr_SetString(UnpicklingError, "pickle data was truncated");
3128 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003129}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003130
3131static int
Tim Peterscba30e22003-02-01 06:24:36 +00003132load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003133{
3134 PyObject *py_int = 0;
3135 char *endptr, *s;
3136 int len, res = -1;
3137 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003138
Tim Peters0bc93f52003-02-02 18:29:33 +00003139 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003140 if (len < 2) return bad_readline();
3141 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003142
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003143 errno = 0;
3144 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003145
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003146 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
3147 /* Hm, maybe we've got something long. Let's try reading
3148 it as a Python long object. */
3149 errno = 0;
3150 py_int = PyLong_FromString(s, NULL, 0);
3151 if (py_int == NULL) {
3152 PyErr_SetString(PyExc_ValueError,
3153 "could not convert string to int");
3154 goto finally;
3155 }
3156 }
3157 else {
Guido van Rossume2763392002-04-05 19:30:08 +00003158 if (len == 3 && (l == 0 || l == 1)) {
3159 if (!( py_int = PyBool_FromLong(l))) goto finally;
3160 }
3161 else {
3162 if (!( py_int = PyInt_FromLong(l))) goto finally;
3163 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003164 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003166 free(s);
3167 PDATA_PUSH(self->stack, py_int, -1);
3168 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003170 finally:
3171 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003173 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003174}
3175
Tim Peters3c67d792003-02-02 17:59:11 +00003176static int
3177load_bool(Unpicklerobject *self, PyObject *boolean)
3178{
3179 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00003180 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00003181 return 0;
3182}
3183
Tim Petersee1a53c2003-02-02 02:57:53 +00003184/* s contains x bytes of a little-endian integer. Return its value as a
3185 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3186 * int, but when x is 4 it's a signed one. This is an historical source
3187 * of x-platform bugs.
3188 */
Tim Peters84e87f32001-03-17 04:50:51 +00003189static long
Tim Petersee1a53c2003-02-02 02:57:53 +00003190calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003191{
3192 unsigned char c;
3193 int i;
3194 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003196 for (i = 0, l = 0L; i < x; i++) {
3197 c = (unsigned char)s[i];
3198 l |= (long)c << (i * 8);
3199 }
Tim Petersbfa18f72001-04-10 01:54:42 +00003200#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003201 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3202 * is signed, so on a box with longs bigger than 4 bytes we need
3203 * to extend a BININT's sign bit to the full width.
3204 */
3205 if (x == 4 && l & (1L << 31))
3206 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00003207#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003208 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003209}
3210
3211
3212static int
Tim Peterscba30e22003-02-01 06:24:36 +00003213load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003214{
3215 PyObject *py_int = 0;
3216 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003217
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003218 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003219
Tim Peterscba30e22003-02-01 06:24:36 +00003220 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003221 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003222
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003223 PDATA_PUSH(self->stack, py_int, -1);
3224 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003225}
3226
3227
3228static int
Tim Peterscba30e22003-02-01 06:24:36 +00003229load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003230{
3231 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003232
Tim Peters0bc93f52003-02-02 18:29:33 +00003233 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003234 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003235
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003236 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003237}
3238
3239
3240static int
Tim Peterscba30e22003-02-01 06:24:36 +00003241load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003242{
3243 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003244
Tim Peters0bc93f52003-02-02 18:29:33 +00003245 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003246 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003247
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003248 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003249}
3250
3251
3252static int
Tim Peterscba30e22003-02-01 06:24:36 +00003253load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003254{
3255 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003256
Tim Peters0bc93f52003-02-02 18:29:33 +00003257 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003258 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003259
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003260 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003261}
Tim Peters84e87f32001-03-17 04:50:51 +00003262
Guido van Rossum60456fd1997-04-09 17:36:32 +00003263static int
Tim Peterscba30e22003-02-01 06:24:36 +00003264load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003265{
3266 PyObject *l = 0;
3267 char *end, *s;
3268 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003269
Tim Peters0bc93f52003-02-02 18:29:33 +00003270 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003271 if (len < 2) return bad_readline();
3272 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003273
Tim Peterscba30e22003-02-01 06:24:36 +00003274 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003275 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003276
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003277 free(s);
3278 PDATA_PUSH(self->stack, l, -1);
3279 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003281 finally:
3282 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003284 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003285}
3286
Tim Petersee1a53c2003-02-02 02:57:53 +00003287/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3288 * data following.
3289 */
3290static int
3291load_counted_long(Unpicklerobject *self, int size)
3292{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003293 Py_ssize_t i;
Tim Petersee1a53c2003-02-02 02:57:53 +00003294 char *nbytes;
3295 unsigned char *pdata;
3296 PyObject *along;
3297
3298 assert(size == 1 || size == 4);
3299 i = self->read_func(self, &nbytes, size);
3300 if (i < 0) return -1;
3301
3302 size = calc_binint(nbytes, size);
3303 if (size < 0) {
3304 /* Corrupt or hostile pickle -- we never write one like
3305 * this.
3306 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003307 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003308 "byte count");
3309 return -1;
3310 }
3311
3312 if (size == 0)
3313 along = PyLong_FromLong(0L);
3314 else {
3315 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003316 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003317 if (i < 0) return -1;
3318 along = _PyLong_FromByteArray(pdata, (size_t)size,
3319 1 /* little endian */, 1 /* signed */);
3320 }
3321 if (along == NULL)
3322 return -1;
3323 PDATA_PUSH(self->stack, along, -1);
3324 return 0;
3325}
Tim Peters84e87f32001-03-17 04:50:51 +00003326
Guido van Rossum60456fd1997-04-09 17:36:32 +00003327static int
Tim Peterscba30e22003-02-01 06:24:36 +00003328load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003329{
3330 PyObject *py_float = 0;
3331 char *endptr, *s;
3332 int len, res = -1;
3333 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003334
Tim Peters0bc93f52003-02-02 18:29:33 +00003335 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003336 if (len < 2) return bad_readline();
3337 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003339 errno = 0;
Martin v. Löwis737ea822004-06-08 18:52:54 +00003340 d = PyOS_ascii_strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003342 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3343 PyErr_SetString(PyExc_ValueError,
3344 "could not convert string to float");
3345 goto finally;
3346 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003347
Tim Peterscba30e22003-02-01 06:24:36 +00003348 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003349 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003350
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003351 free(s);
3352 PDATA_PUSH(self->stack, py_float, -1);
3353 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003355 finally:
3356 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003358 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003359}
3360
Guido van Rossum60456fd1997-04-09 17:36:32 +00003361static int
Tim Peterscba30e22003-02-01 06:24:36 +00003362load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003363{
Tim Peters9905b942003-03-20 20:53:32 +00003364 PyObject *py_float;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003365 double x;
3366 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003367
Tim Peters0bc93f52003-02-02 18:29:33 +00003368 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003369 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003370
Tim Peters9905b942003-03-20 20:53:32 +00003371 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3372 if (x == -1.0 && PyErr_Occurred())
3373 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003374
Tim Peters9905b942003-03-20 20:53:32 +00003375 py_float = PyFloat_FromDouble(x);
3376 if (py_float == NULL)
3377 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003378
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003379 PDATA_PUSH(self->stack, py_float, -1);
3380 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003381}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003382
3383static int
Tim Peterscba30e22003-02-01 06:24:36 +00003384load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003385{
3386 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003387 int len, res = -1;
3388 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003389
Tim Peters0bc93f52003-02-02 18:29:33 +00003390 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003391 if (len < 2) return bad_readline();
3392 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003393
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003394
3395 /* Strip outermost quotes */
3396 while (s[len-1] <= ' ')
3397 len--;
3398 if(s[0]=='"' && s[len-1]=='"'){
3399 s[len-1] = '\0';
3400 p = s + 1 ;
3401 len -= 2;
3402 } else if(s[0]=='\'' && s[len-1]=='\''){
3403 s[len-1] = '\0';
3404 p = s + 1 ;
3405 len -= 2;
3406 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003407 goto insecure;
3408 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003409
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003410 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
Neal Norwitz99dfe3c2006-08-02 04:27:11 +00003411 free(s);
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003412 if (str) {
3413 PDATA_PUSH(self->stack, str, -1);
3414 res = 0;
3415 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003416 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003417
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003418 insecure:
3419 free(s);
3420 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3421 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003422}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003423
3424
3425static int
Tim Peterscba30e22003-02-01 06:24:36 +00003426load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003427{
3428 PyObject *py_string = 0;
3429 long l;
3430 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003431
Tim Peters0bc93f52003-02-02 18:29:33 +00003432 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003434 l = calc_binint(s, 4);
Martin v. Löwis73c01d42008-02-14 11:26:18 +00003435 if (l < 0) {
3436 /* Corrupt or hostile pickle -- we never write one like
3437 * this.
3438 */
3439 PyErr_SetString(UnpicklingError,
3440 "BINSTRING pickle has negative byte count");
3441 return -1;
3442 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003443
Tim Peters0bc93f52003-02-02 18:29:33 +00003444 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003445 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003446
Tim Peterscba30e22003-02-01 06:24:36 +00003447 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003448 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003450 PDATA_PUSH(self->stack, py_string, -1);
3451 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003452}
3453
3454
3455static int
Tim Peterscba30e22003-02-01 06:24:36 +00003456load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003457{
3458 PyObject *py_string = 0;
3459 unsigned char l;
3460 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003461
Tim Peters0bc93f52003-02-02 18:29:33 +00003462 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003463 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003465 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003466
Tim Peters0bc93f52003-02-02 18:29:33 +00003467 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003468
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003469 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003470
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003471 PDATA_PUSH(self->stack, py_string, -1);
3472 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003473}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003474
3475
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003476#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003477static int
Tim Peterscba30e22003-02-01 06:24:36 +00003478load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003479{
3480 PyObject *str = 0;
3481 int len, res = -1;
3482 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003483
Tim Peters0bc93f52003-02-02 18:29:33 +00003484 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003485 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003486
Tim Peterscba30e22003-02-01 06:24:36 +00003487 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003488 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003490 PDATA_PUSH(self->stack, str, -1);
3491 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003492
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003493 finally:
3494 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003495}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003496#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003497
3498
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003499#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003500static int
Tim Peterscba30e22003-02-01 06:24:36 +00003501load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003502{
3503 PyObject *unicode;
3504 long l;
3505 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003506
Tim Peters0bc93f52003-02-02 18:29:33 +00003507 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003508
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003509 l = calc_binint(s, 4);
Martin v. Löwis73c01d42008-02-14 11:26:18 +00003510 if (l < 0) {
3511 /* Corrupt or hostile pickle -- we never write one like
3512 * this.
3513 */
3514 PyErr_SetString(UnpicklingError,
3515 "BINUNICODE pickle has negative byte count");
3516 return -1;
3517 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003518
Tim Peters0bc93f52003-02-02 18:29:33 +00003519 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003520 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003521
Tim Peterscba30e22003-02-01 06:24:36 +00003522 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003523 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003525 PDATA_PUSH(self->stack, unicode, -1);
3526 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003527}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003528#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003529
3530
3531static int
Tim Peterscba30e22003-02-01 06:24:36 +00003532load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003533{
3534 PyObject *tup;
3535 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003536
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003537 if ((i = marker(self)) < 0) return -1;
3538 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3539 PDATA_PUSH(self->stack, tup, -1);
3540 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003541}
3542
3543static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003544load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003545{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003546 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003547
Tim Peters1d63c9f2003-02-02 20:29:39 +00003548 if (tup == NULL)
3549 return -1;
3550
3551 while (--len >= 0) {
3552 PyObject *element;
3553
3554 PDATA_POP(self->stack, element);
3555 if (element == NULL)
3556 return -1;
3557 PyTuple_SET_ITEM(tup, len, element);
3558 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003559 PDATA_PUSH(self->stack, tup, -1);
3560 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003561}
3562
3563static int
Tim Peterscba30e22003-02-01 06:24:36 +00003564load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003565{
3566 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003567
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003568 if (!( list=PyList_New(0))) return -1;
3569 PDATA_PUSH(self->stack, list, -1);
3570 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003571}
3572
3573static int
Tim Peterscba30e22003-02-01 06:24:36 +00003574load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003575{
3576 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003577
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003578 if (!( dict=PyDict_New())) return -1;
3579 PDATA_PUSH(self->stack, dict, -1);
3580 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003581}
3582
3583
3584static int
Tim Peterscba30e22003-02-01 06:24:36 +00003585load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003586{
3587 PyObject *list = 0;
3588 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003589
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003590 if ((i = marker(self)) < 0) return -1;
3591 if (!( list=Pdata_popList(self->stack, i))) return -1;
3592 PDATA_PUSH(self->stack, list, -1);
3593 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003594}
3595
3596static int
Tim Peterscba30e22003-02-01 06:24:36 +00003597load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003598{
3599 PyObject *dict, *key, *value;
3600 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003602 if ((i = marker(self)) < 0) return -1;
3603 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003604
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003605 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003607 for (k = i+1; k < j; k += 2) {
3608 key =self->stack->data[k-1];
3609 value=self->stack->data[k ];
3610 if (PyDict_SetItem(dict, key, value) < 0) {
3611 Py_DECREF(dict);
3612 return -1;
3613 }
3614 }
3615 Pdata_clear(self->stack, i);
3616 PDATA_PUSH(self->stack, dict, -1);
3617 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003618}
3619
3620static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003621Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003622{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003623 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003624
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003625 if (PyClass_Check(cls)) {
3626 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003628 if ((l=PyObject_Size(args)) < 0) goto err;
3629 if (!( l )) {
3630 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003631
Tim Peterscba30e22003-02-01 06:24:36 +00003632 __getinitargs__ = PyObject_GetAttr(cls,
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00003633 __getinitargs___str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003634 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003635 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003636 so bypass usual construction */
3637 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003638
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003639 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003640 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003641 goto err;
3642 return inst;
3643 }
3644 Py_DECREF(__getinitargs__);
3645 }
Tim Peters84e87f32001-03-17 04:50:51 +00003646
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003647 if ((r=PyInstance_New(cls, args, NULL))) return r;
3648 else goto err;
3649 }
Tim Peters84e87f32001-03-17 04:50:51 +00003650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003651 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003652
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003653 err:
3654 {
Neal Norwitz0f8b31a2006-06-28 06:28:31 +00003655 PyObject *tp, *v, *tb, *tmp_value;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003657 PyErr_Fetch(&tp, &v, &tb);
Neal Norwitz0f8b31a2006-06-28 06:28:31 +00003658 tmp_value = v;
3659 /* NULL occurs when there was a KeyboardInterrupt */
3660 if (tmp_value == NULL)
3661 tmp_value = Py_None;
3662 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003663 Py_XDECREF(v);
3664 v=r;
3665 }
3666 PyErr_Restore(tp,v,tb);
3667 }
3668 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003669}
Tim Peters84e87f32001-03-17 04:50:51 +00003670
Guido van Rossum60456fd1997-04-09 17:36:32 +00003671
3672static int
Tim Peterscba30e22003-02-01 06:24:36 +00003673load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003674{
3675 PyObject *class, *tup, *obj=0;
3676 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003677
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003678 if ((i = marker(self)) < 0) return -1;
3679 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3680 PDATA_POP(self->stack, class);
3681 if (class) {
3682 obj = Instance_New(class, tup);
3683 Py_DECREF(class);
3684 }
3685 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003687 if (! obj) return -1;
3688 PDATA_PUSH(self->stack, obj, -1);
3689 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003690}
3691
3692
3693static int
Tim Peterscba30e22003-02-01 06:24:36 +00003694load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003695{
3696 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3697 int i, len;
3698 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003700 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003701
Tim Peters0bc93f52003-02-02 18:29:33 +00003702 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003703 if (len < 2) return bad_readline();
3704 module_name = PyString_FromStringAndSize(s, len - 1);
3705 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003706
Tim Peters0bc93f52003-02-02 18:29:33 +00003707 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003708 if (len < 2) return bad_readline();
3709 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003710 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003711 self->find_class);
3712 Py_DECREF(class_name);
3713 }
3714 }
3715 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003716
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003717 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003718
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003719 if ((tup=Pdata_popTuple(self->stack, i))) {
3720 obj = Instance_New(class, tup);
3721 Py_DECREF(tup);
3722 }
3723 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003724
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003725 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003727 PDATA_PUSH(self->stack, obj, -1);
3728 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003729}
3730
Tim Peterseab7db32003-02-13 18:24:14 +00003731static int
3732load_newobj(Unpicklerobject *self)
3733{
3734 PyObject *args = NULL;
3735 PyObject *clsraw = NULL;
3736 PyTypeObject *cls; /* clsraw cast to its true type */
3737 PyObject *obj;
3738
3739 /* Stack is ... cls argtuple, and we want to call
3740 * cls.__new__(cls, *argtuple).
3741 */
3742 PDATA_POP(self->stack, args);
3743 if (args == NULL) goto Fail;
3744 if (! PyTuple_Check(args)) {
3745 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3746 "tuple.");
3747 goto Fail;
3748 }
3749
3750 PDATA_POP(self->stack, clsraw);
3751 cls = (PyTypeObject *)clsraw;
3752 if (cls == NULL) goto Fail;
3753 if (! PyType_Check(cls)) {
3754 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3755 "isn't a type object");
3756 goto Fail;
3757 }
3758 if (cls->tp_new == NULL) {
3759 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3760 "has NULL tp_new");
3761 goto Fail;
3762 }
3763
3764 /* Call __new__. */
3765 obj = cls->tp_new(cls, args, NULL);
3766 if (obj == NULL) goto Fail;
3767
3768 Py_DECREF(args);
3769 Py_DECREF(clsraw);
3770 PDATA_PUSH(self->stack, obj, -1);
3771 return 0;
3772
3773 Fail:
3774 Py_XDECREF(args);
3775 Py_XDECREF(clsraw);
3776 return -1;
3777}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003778
3779static int
Tim Peterscba30e22003-02-01 06:24:36 +00003780load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003781{
3782 PyObject *class = 0, *module_name = 0, *class_name = 0;
3783 int len;
3784 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003785
Tim Peters0bc93f52003-02-02 18:29:33 +00003786 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003787 if (len < 2) return bad_readline();
3788 module_name = PyString_FromStringAndSize(s, len - 1);
3789 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003790
Tim Peters0bc93f52003-02-02 18:29:33 +00003791 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003792 if (len < 2) {
3793 Py_DECREF(module_name);
3794 return bad_readline();
3795 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003796 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003797 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003798 self->find_class);
3799 Py_DECREF(class_name);
3800 }
3801 }
3802 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003804 if (! class) return -1;
3805 PDATA_PUSH(self->stack, class, -1);
3806 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003807}
3808
3809
3810static int
Tim Peterscba30e22003-02-01 06:24:36 +00003811load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003812{
3813 PyObject *pid = 0;
3814 int len;
3815 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003817 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003818 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003819 if (len < 2) return bad_readline();
3820
3821 pid = PyString_FromStringAndSize(s, len - 1);
3822 if (!pid) return -1;
3823
3824 if (PyList_Check(self->pers_func)) {
3825 if (PyList_Append(self->pers_func, pid) < 0) {
3826 Py_DECREF(pid);
3827 return -1;
3828 }
3829 }
3830 else {
3831 ARG_TUP(self, pid);
3832 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003833 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003834 NULL);
3835 FREE_ARG_TUP(self);
3836 }
3837 }
3838
3839 if (! pid) return -1;
3840
3841 PDATA_PUSH(self->stack, pid, -1);
3842 return 0;
3843 }
3844 else {
3845 PyErr_SetString(UnpicklingError,
3846 "A load persistent id instruction was encountered,\n"
3847 "but no persistent_load function was specified.");
3848 return -1;
3849 }
3850}
3851
3852static int
Tim Peterscba30e22003-02-01 06:24:36 +00003853load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003854{
3855 PyObject *pid = 0;
3856
3857 if (self->pers_func) {
3858 PDATA_POP(self->stack, pid);
3859 if (! pid) return -1;
3860
3861 if (PyList_Check(self->pers_func)) {
3862 if (PyList_Append(self->pers_func, pid) < 0) {
3863 Py_DECREF(pid);
3864 return -1;
3865 }
3866 }
3867 else {
3868 ARG_TUP(self, pid);
3869 if (self->arg) {
3870 pid = PyObject_Call(self->pers_func, self->arg,
3871 NULL);
3872 FREE_ARG_TUP(self);
3873 }
3874 if (! pid) return -1;
3875 }
3876
3877 PDATA_PUSH(self->stack, pid, -1);
3878 return 0;
3879 }
3880 else {
3881 PyErr_SetString(UnpicklingError,
3882 "A load persistent id instruction was encountered,\n"
3883 "but no persistent_load function was specified.");
3884 return -1;
3885 }
3886}
3887
3888
3889static int
Tim Peterscba30e22003-02-01 06:24:36 +00003890load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003891{
3892 int len;
3893
3894 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3895
3896 /* Note that we split the (pickle.py) stack into two stacks,
3897 an object stack and a mark stack. We have to be clever and
3898 pop the right one. We do this by looking at the top of the
3899 mark stack.
3900 */
3901
3902 if ((self->num_marks > 0) &&
3903 (self->marks[self->num_marks - 1] == len))
3904 self->num_marks--;
3905 else {
3906 len--;
3907 Py_DECREF(self->stack->data[len]);
3908 self->stack->length=len;
3909 }
3910
3911 return 0;
3912}
3913
3914
3915static int
Tim Peterscba30e22003-02-01 06:24:36 +00003916load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003917{
3918 int i;
3919
3920 if ((i = marker(self)) < 0)
3921 return -1;
3922
3923 Pdata_clear(self->stack, i);
3924
3925 return 0;
3926}
3927
3928
3929static int
Tim Peterscba30e22003-02-01 06:24:36 +00003930load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003931{
3932 PyObject *last;
3933 int len;
3934
3935 if ((len = self->stack->length) <= 0) return stackUnderflow();
3936 last=self->stack->data[len-1];
3937 Py_INCREF(last);
3938 PDATA_PUSH(self->stack, last, -1);
3939 return 0;
3940}
3941
3942
3943static int
Tim Peterscba30e22003-02-01 06:24:36 +00003944load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003945{
3946 PyObject *py_str = 0, *value = 0;
3947 int len;
3948 char *s;
3949 int rc;
3950
Tim Peters0bc93f52003-02-02 18:29:33 +00003951 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003952 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003953
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003954 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003955
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003956 value = PyDict_GetItem(self->memo, py_str);
3957 if (! value) {
3958 PyErr_SetObject(BadPickleGet, py_str);
3959 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003960 }
3961 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003962 PDATA_APPEND(self->stack, value, -1);
3963 rc = 0;
3964 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003966 Py_DECREF(py_str);
3967 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003968}
3969
3970
3971static int
Tim Peterscba30e22003-02-01 06:24:36 +00003972load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003973{
3974 PyObject *py_key = 0, *value = 0;
3975 unsigned char key;
3976 char *s;
3977 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003978
Tim Peters0bc93f52003-02-02 18:29:33 +00003979 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003981 key = (unsigned char)s[0];
3982 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003983
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003984 value = PyDict_GetItem(self->memo, py_key);
3985 if (! value) {
3986 PyErr_SetObject(BadPickleGet, py_key);
3987 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003988 }
3989 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003990 PDATA_APPEND(self->stack, value, -1);
3991 rc = 0;
3992 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003993
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003994 Py_DECREF(py_key);
3995 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003996}
3997
3998
3999static int
Tim Peterscba30e22003-02-01 06:24:36 +00004000load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004001{
4002 PyObject *py_key = 0, *value = 0;
4003 unsigned char c;
4004 char *s;
4005 long key;
4006 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004007
Tim Peters0bc93f52003-02-02 18:29:33 +00004008 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004009
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004010 c = (unsigned char)s[0];
4011 key = (long)c;
4012 c = (unsigned char)s[1];
4013 key |= (long)c << 8;
4014 c = (unsigned char)s[2];
4015 key |= (long)c << 16;
4016 c = (unsigned char)s[3];
4017 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004018
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004019 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4020
4021 value = PyDict_GetItem(self->memo, py_key);
4022 if (! value) {
4023 PyErr_SetObject(BadPickleGet, py_key);
4024 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004025 }
4026 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004027 PDATA_APPEND(self->stack, value, -1);
4028 rc = 0;
4029 }
4030
4031 Py_DECREF(py_key);
4032 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004033}
4034
Tim Peters2d629652003-02-04 05:06:17 +00004035/* Push an object from the extension registry (EXT[124]). nbytes is
4036 * the number of bytes following the opcode, holding the index (code) value.
4037 */
4038static int
4039load_extension(Unpicklerobject *self, int nbytes)
4040{
4041 char *codebytes; /* the nbytes bytes after the opcode */
4042 long code; /* calc_binint returns long */
4043 PyObject *py_code; /* code as a Python int */
4044 PyObject *obj; /* the object to push */
4045 PyObject *pair; /* (module_name, class_name) */
4046 PyObject *module_name, *class_name;
4047
4048 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4049 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4050 code = calc_binint(codebytes, nbytes);
4051 if (code <= 0) { /* note that 0 is forbidden */
4052 /* Corrupt or hostile pickle. */
4053 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
4054 return -1;
4055 }
4056
4057 /* Look for the code in the cache. */
4058 py_code = PyInt_FromLong(code);
4059 if (py_code == NULL) return -1;
4060 obj = PyDict_GetItem(extension_cache, py_code);
4061 if (obj != NULL) {
4062 /* Bingo. */
4063 Py_DECREF(py_code);
4064 PDATA_APPEND(self->stack, obj, -1);
4065 return 0;
4066 }
4067
4068 /* Look up the (module_name, class_name) pair. */
4069 pair = PyDict_GetItem(inverted_registry, py_code);
4070 if (pair == NULL) {
4071 Py_DECREF(py_code);
4072 PyErr_Format(PyExc_ValueError, "unregistered extension "
4073 "code %ld", code);
4074 return -1;
4075 }
4076 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00004077 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00004078 */
4079 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
4080 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
4081 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
4082 Py_DECREF(py_code);
4083 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
4084 "isn't a 2-tuple of strings", code);
4085 return -1;
4086 }
4087 /* Load the object. */
4088 obj = find_class(module_name, class_name, self->find_class);
4089 if (obj == NULL) {
4090 Py_DECREF(py_code);
4091 return -1;
4092 }
4093 /* Cache code -> obj. */
4094 code = PyDict_SetItem(extension_cache, py_code, obj);
4095 Py_DECREF(py_code);
4096 if (code < 0) {
4097 Py_DECREF(obj);
4098 return -1;
4099 }
4100 PDATA_PUSH(self->stack, obj, -1);
4101 return 0;
4102}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004103
4104static int
Tim Peterscba30e22003-02-01 06:24:36 +00004105load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004106{
4107 PyObject *py_str = 0, *value = 0;
4108 int len, l;
4109 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004110
Tim Peters0bc93f52003-02-02 18:29:33 +00004111 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004112 if (l < 2) return bad_readline();
4113 if (!( len=self->stack->length )) return stackUnderflow();
4114 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
4115 value=self->stack->data[len-1];
4116 l=PyDict_SetItem(self->memo, py_str, value);
4117 Py_DECREF(py_str);
4118 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004119}
4120
4121
4122static int
Tim Peterscba30e22003-02-01 06:24:36 +00004123load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004124{
4125 PyObject *py_key = 0, *value = 0;
4126 unsigned char key;
4127 char *s;
4128 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004129
Tim Peters0bc93f52003-02-02 18:29:33 +00004130 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004131 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004133 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00004134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004135 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4136 value=self->stack->data[len-1];
4137 len=PyDict_SetItem(self->memo, py_key, value);
4138 Py_DECREF(py_key);
4139 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004140}
4141
4142
4143static int
Tim Peterscba30e22003-02-01 06:24:36 +00004144load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004145{
4146 PyObject *py_key = 0, *value = 0;
4147 long key;
4148 unsigned char c;
4149 char *s;
4150 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004151
Tim Peters0bc93f52003-02-02 18:29:33 +00004152 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004153 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004155 c = (unsigned char)s[0];
4156 key = (long)c;
4157 c = (unsigned char)s[1];
4158 key |= (long)c << 8;
4159 c = (unsigned char)s[2];
4160 key |= (long)c << 16;
4161 c = (unsigned char)s[3];
4162 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00004163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004164 if (!( py_key = PyInt_FromLong(key))) return -1;
4165 value=self->stack->data[len-1];
4166 len=PyDict_SetItem(self->memo, py_key, value);
4167 Py_DECREF(py_key);
4168 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004169}
4170
4171
4172static int
Tim Peterscba30e22003-02-01 06:24:36 +00004173do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004174{
4175 PyObject *value = 0, *list = 0, *append_method = 0;
4176 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004178 len=self->stack->length;
4179 if (!( len >= x && x > 0 )) return stackUnderflow();
4180 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00004181 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004182
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004183 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004185 if (PyList_Check(list)) {
4186 PyObject *slice;
4187 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00004188
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004189 slice=Pdata_popList(self->stack, x);
Neal Norwitzb59d08c2006-07-22 16:20:49 +00004190 if (! slice) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004191 list_len = PyList_GET_SIZE(list);
4192 i=PyList_SetSlice(list, list_len, list_len, slice);
4193 Py_DECREF(slice);
4194 return i;
4195 }
4196 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004197
Tim Peterscba30e22003-02-01 06:24:36 +00004198 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004199 return -1;
4200
4201 for (i = x; i < len; i++) {
4202 PyObject *junk;
4203
4204 value=self->stack->data[i];
4205 junk=0;
4206 ARG_TUP(self, value);
4207 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004208 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004209 NULL);
4210 FREE_ARG_TUP(self);
4211 }
4212 if (! junk) {
4213 Pdata_clear(self->stack, i+1);
4214 self->stack->length=x;
4215 Py_DECREF(append_method);
4216 return -1;
4217 }
4218 Py_DECREF(junk);
4219 }
4220 self->stack->length=x;
4221 Py_DECREF(append_method);
4222 }
4223
4224 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004225}
4226
4227
4228static int
Tim Peterscba30e22003-02-01 06:24:36 +00004229load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004230{
4231 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004232}
4233
4234
4235static int
Tim Peterscba30e22003-02-01 06:24:36 +00004236load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004237{
4238 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004239}
4240
4241
4242static int
Tim Peterscba30e22003-02-01 06:24:36 +00004243do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004244{
4245 PyObject *value = 0, *key = 0, *dict = 0;
4246 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004247
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004248 if (!( (len=self->stack->length) >= x
4249 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004250
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004251 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004252
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004253 for (i = x+1; i < len; i += 2) {
4254 key =self->stack->data[i-1];
4255 value=self->stack->data[i ];
4256 if (PyObject_SetItem(dict, key, value) < 0) {
4257 r=-1;
4258 break;
4259 }
4260 }
4261
4262 Pdata_clear(self->stack, x);
4263
4264 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004265}
4266
4267
Tim Peters84e87f32001-03-17 04:50:51 +00004268static int
Tim Peterscba30e22003-02-01 06:24:36 +00004269load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004270{
4271 return do_setitems(self, self->stack->length - 2);
4272}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004273
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004274static int
Tim Peterscba30e22003-02-01 06:24:36 +00004275load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004276{
4277 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004278}
4279
Tim Peters84e87f32001-03-17 04:50:51 +00004280
Guido van Rossum60456fd1997-04-09 17:36:32 +00004281static int
Tim Peterscba30e22003-02-01 06:24:36 +00004282load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004283{
Tim Peters080c88b2003-02-15 03:01:11 +00004284 PyObject *state, *inst, *slotstate;
4285 PyObject *__setstate__;
4286 PyObject *d_key, *d_value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004287 Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00004288 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004289
Tim Peters080c88b2003-02-15 03:01:11 +00004290 /* Stack is ... instance, state. We want to leave instance at
4291 * the stack top, possibly mutated via instance.__setstate__(state).
4292 */
4293 if (self->stack->length < 2)
4294 return stackUnderflow();
4295 PDATA_POP(self->stack, state);
4296 if (state == NULL)
4297 return -1;
4298 inst = self->stack->data[self->stack->length - 1];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004299
Tim Peters080c88b2003-02-15 03:01:11 +00004300 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
4301 if (__setstate__ != NULL) {
4302 PyObject *junk = NULL;
4303
4304 /* The explicit __setstate__ is responsible for everything. */
4305 ARG_TUP(self, state);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004306 if (self->arg) {
4307 junk = PyObject_Call(__setstate__, self->arg, NULL);
4308 FREE_ARG_TUP(self);
4309 }
4310 Py_DECREF(__setstate__);
Tim Peters080c88b2003-02-15 03:01:11 +00004311 if (junk == NULL)
4312 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004313 Py_DECREF(junk);
4314 return 0;
4315 }
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00004316 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4317 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004318 PyErr_Clear();
Tim Peters080c88b2003-02-15 03:01:11 +00004319
4320 /* A default __setstate__. First see whether state embeds a
4321 * slot state dict too (a proto 2 addition).
4322 */
4323 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
4324 PyObject *temp = state;
4325 state = PyTuple_GET_ITEM(temp, 0);
4326 slotstate = PyTuple_GET_ITEM(temp, 1);
4327 Py_INCREF(state);
4328 Py_INCREF(slotstate);
4329 Py_DECREF(temp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004330 }
Tim Peters080c88b2003-02-15 03:01:11 +00004331 else
4332 slotstate = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004333
Tim Peters080c88b2003-02-15 03:01:11 +00004334 /* Set inst.__dict__ from the state dict (if any). */
4335 if (state != Py_None) {
4336 PyObject *dict;
4337 if (! PyDict_Check(state)) {
4338 PyErr_SetString(UnpicklingError, "state is not a "
4339 "dictionary");
4340 goto finally;
4341 }
4342 dict = PyObject_GetAttr(inst, __dict___str);
4343 if (dict == NULL)
4344 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004345
Tim Peters080c88b2003-02-15 03:01:11 +00004346 i = 0;
4347 while (PyDict_Next(state, &i, &d_key, &d_value)) {
4348 if (PyObject_SetItem(dict, d_key, d_value) < 0)
4349 goto finally;
4350 }
4351 Py_DECREF(dict);
4352 }
4353
4354 /* Also set instance attributes from the slotstate dict (if any). */
4355 if (slotstate != NULL) {
4356 if (! PyDict_Check(slotstate)) {
4357 PyErr_SetString(UnpicklingError, "slot state is not "
4358 "a dictionary");
4359 goto finally;
4360 }
4361 i = 0;
4362 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4363 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4364 goto finally;
4365 }
4366 }
4367 res = 0;
4368
4369 finally:
4370 Py_DECREF(state);
4371 Py_XDECREF(slotstate);
4372 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004373}
4374
4375
4376static int
Tim Peterscba30e22003-02-01 06:24:36 +00004377load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004378{
4379 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004380
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004381 /* Note that we split the (pickle.py) stack into two stacks, an
4382 object stack and a mark stack. Here we push a mark onto the
4383 mark stack.
4384 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004386 if ((self->num_marks + 1) >= self->marks_size) {
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +00004387 int *marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004388 s=self->marks_size+20;
4389 if (s <= self->num_marks) s=self->num_marks + 1;
4390 if (self->marks == NULL)
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +00004391 marks=(int *)malloc(s * sizeof(int));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004392 else
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +00004393 marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004394 s * sizeof(int));
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +00004395 if (!marks) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004396 PyErr_NoMemory();
4397 return -1;
4398 }
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +00004399 self->marks = marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004400 self->marks_size = s;
4401 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004403 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004405 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004406}
4407
Guido van Rossum60456fd1997-04-09 17:36:32 +00004408static int
Tim Peterscba30e22003-02-01 06:24:36 +00004409load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004410{
4411 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004413 PDATA_POP(self->stack, arg_tup);
4414 if (! arg_tup) return -1;
4415 PDATA_POP(self->stack, callable);
4416 if (callable) {
4417 ob = Instance_New(callable, arg_tup);
4418 Py_DECREF(callable);
4419 }
4420 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004421
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004422 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004424 PDATA_PUSH(self->stack, ob, -1);
4425 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004426}
Tim Peters84e87f32001-03-17 04:50:51 +00004427
Tim Peters4190fb82003-02-02 16:09:05 +00004428/* Just raises an error if we don't know the protocol specified. PROTO
4429 * is the first opcode for protocols >= 2.
4430 */
4431static int
4432load_proto(Unpicklerobject *self)
4433{
4434 int i;
4435 char *protobyte;
4436
4437 i = self->read_func(self, &protobyte, 1);
4438 if (i < 0)
4439 return -1;
4440
4441 i = calc_binint(protobyte, 1);
4442 /* No point checking for < 0, since calc_binint returns an unsigned
4443 * int when chewing on 1 byte.
4444 */
4445 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004446 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004447 return 0;
4448
4449 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4450 return -1;
4451}
4452
Guido van Rossum60456fd1997-04-09 17:36:32 +00004453static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004454load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004455{
4456 PyObject *err = 0, *val = 0;
4457 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004458
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004459 self->num_marks = 0;
4460 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004461
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004462 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004463 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004464 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004466 switch (s[0]) {
4467 case NONE:
4468 if (load_none(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 BININT:
4473 if (load_binint(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 BININT1:
4478 if (load_binint1(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 BININT2:
4483 if (load_binint2(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 INT:
4488 if (load_int(self) < 0)
4489 break;
4490 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004492 case LONG:
4493 if (load_long(self) < 0)
4494 break;
4495 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004496
Tim Petersee1a53c2003-02-02 02:57:53 +00004497 case LONG1:
4498 if (load_counted_long(self, 1) < 0)
4499 break;
4500 continue;
4501
4502 case LONG4:
4503 if (load_counted_long(self, 4) < 0)
4504 break;
4505 continue;
4506
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004507 case FLOAT:
4508 if (load_float(self) < 0)
4509 break;
4510 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004512 case BINFLOAT:
4513 if (load_binfloat(self) < 0)
4514 break;
4515 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004516
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004517 case BINSTRING:
4518 if (load_binstring(self) < 0)
4519 break;
4520 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004521
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004522 case SHORT_BINSTRING:
4523 if (load_short_binstring(self) < 0)
4524 break;
4525 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004527 case STRING:
4528 if (load_string(self) < 0)
4529 break;
4530 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004531
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004532#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004533 case UNICODE:
4534 if (load_unicode(self) < 0)
4535 break;
4536 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004537
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004538 case BINUNICODE:
4539 if (load_binunicode(self) < 0)
4540 break;
4541 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004542#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004544 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004545 if (load_counted_tuple(self, 0) < 0)
4546 break;
4547 continue;
4548
4549 case TUPLE1:
4550 if (load_counted_tuple(self, 1) < 0)
4551 break;
4552 continue;
4553
4554 case TUPLE2:
4555 if (load_counted_tuple(self, 2) < 0)
4556 break;
4557 continue;
4558
4559 case TUPLE3:
4560 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004561 break;
4562 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004563
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004564 case TUPLE:
4565 if (load_tuple(self) < 0)
4566 break;
4567 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004569 case EMPTY_LIST:
4570 if (load_empty_list(self) < 0)
4571 break;
4572 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004573
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004574 case LIST:
4575 if (load_list(self) < 0)
4576 break;
4577 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004578
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004579 case EMPTY_DICT:
4580 if (load_empty_dict(self) < 0)
4581 break;
4582 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004583
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004584 case DICT:
4585 if (load_dict(self) < 0)
4586 break;
4587 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004588
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004589 case OBJ:
4590 if (load_obj(self) < 0)
4591 break;
4592 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004593
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004594 case INST:
4595 if (load_inst(self) < 0)
4596 break;
4597 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004598
Tim Peterseab7db32003-02-13 18:24:14 +00004599 case NEWOBJ:
4600 if (load_newobj(self) < 0)
4601 break;
4602 continue;
4603
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004604 case GLOBAL:
4605 if (load_global(self) < 0)
4606 break;
4607 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004609 case APPEND:
4610 if (load_append(self) < 0)
4611 break;
4612 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004614 case APPENDS:
4615 if (load_appends(self) < 0)
4616 break;
4617 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004618
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004619 case BUILD:
4620 if (load_build(self) < 0)
4621 break;
4622 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004623
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004624 case DUP:
4625 if (load_dup(self) < 0)
4626 break;
4627 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004628
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004629 case BINGET:
4630 if (load_binget(self) < 0)
4631 break;
4632 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004633
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004634 case LONG_BINGET:
4635 if (load_long_binget(self) < 0)
4636 break;
4637 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004638
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004639 case GET:
4640 if (load_get(self) < 0)
4641 break;
4642 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004643
Tim Peters2d629652003-02-04 05:06:17 +00004644 case EXT1:
4645 if (load_extension(self, 1) < 0)
4646 break;
4647 continue;
4648
4649 case EXT2:
4650 if (load_extension(self, 2) < 0)
4651 break;
4652 continue;
4653
4654 case EXT4:
4655 if (load_extension(self, 4) < 0)
4656 break;
4657 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004658 case MARK:
4659 if (load_mark(self) < 0)
4660 break;
4661 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004662
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004663 case BINPUT:
4664 if (load_binput(self) < 0)
4665 break;
4666 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004668 case LONG_BINPUT:
4669 if (load_long_binput(self) < 0)
4670 break;
4671 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004672
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004673 case PUT:
4674 if (load_put(self) < 0)
4675 break;
4676 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004677
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004678 case POP:
4679 if (load_pop(self) < 0)
4680 break;
4681 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004683 case POP_MARK:
4684 if (load_pop_mark(self) < 0)
4685 break;
4686 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004687
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004688 case SETITEM:
4689 if (load_setitem(self) < 0)
4690 break;
4691 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004692
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004693 case SETITEMS:
4694 if (load_setitems(self) < 0)
4695 break;
4696 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004698 case STOP:
4699 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004700
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004701 case PERSID:
4702 if (load_persid(self) < 0)
4703 break;
4704 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004706 case BINPERSID:
4707 if (load_binpersid(self) < 0)
4708 break;
4709 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004711 case REDUCE:
4712 if (load_reduce(self) < 0)
4713 break;
4714 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004715
Tim Peters4190fb82003-02-02 16:09:05 +00004716 case PROTO:
4717 if (load_proto(self) < 0)
4718 break;
4719 continue;
4720
Tim Peters3c67d792003-02-02 17:59:11 +00004721 case NEWTRUE:
4722 if (load_bool(self, Py_True) < 0)
4723 break;
4724 continue;
4725
4726 case NEWFALSE:
4727 if (load_bool(self, Py_False) < 0)
4728 break;
4729 continue;
4730
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004731 case '\0':
4732 /* end of file */
4733 PyErr_SetNone(PyExc_EOFError);
4734 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004736 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004737 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004738 "invalid load key, '%s'.",
4739 "c", s[0]);
4740 return NULL;
4741 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004742
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004743 break;
4744 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004745
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004746 if ((err = PyErr_Occurred())) {
4747 if (err == PyExc_EOFError) {
4748 PyErr_SetNone(PyExc_EOFError);
4749 }
4750 return NULL;
4751 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004753 PDATA_POP(self->stack, val);
4754 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004755}
Tim Peters84e87f32001-03-17 04:50:51 +00004756
Guido van Rossum60456fd1997-04-09 17:36:32 +00004757
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004758/* No-load functions to support noload, which is used to
4759 find persistent references. */
4760
4761static int
Tim Peterscba30e22003-02-01 06:24:36 +00004762noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004763{
4764 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004765
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004766 if ((i = marker(self)) < 0) return -1;
4767 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004768}
4769
4770
4771static int
Tim Peterscba30e22003-02-01 06:24:36 +00004772noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004773{
4774 int i;
4775 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004777 if ((i = marker(self)) < 0) return -1;
4778 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004779 if (self->readline_func(self, &s) < 0) return -1;
4780 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00004781 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004782 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004783}
4784
4785static int
Tim Peterseab7db32003-02-13 18:24:14 +00004786noload_newobj(Unpicklerobject *self)
4787{
4788 PyObject *obj;
4789
4790 PDATA_POP(self->stack, obj); /* pop argtuple */
4791 if (obj == NULL) return -1;
4792 Py_DECREF(obj);
4793
4794 PDATA_POP(self->stack, obj); /* pop cls */
4795 if (obj == NULL) return -1;
4796 Py_DECREF(obj);
4797
4798 PDATA_APPEND(self->stack, Py_None, -1);
4799 return 0;
4800}
4801
4802static int
Tim Peterscba30e22003-02-01 06:24:36 +00004803noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004804{
4805 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004806
Tim Peters0bc93f52003-02-02 18:29:33 +00004807 if (self->readline_func(self, &s) < 0) return -1;
4808 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004809 PDATA_APPEND(self->stack, Py_None,-1);
4810 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004811}
4812
4813static int
Tim Peterscba30e22003-02-01 06:24:36 +00004814noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004815{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004817 if (self->stack->length < 2) return stackUnderflow();
4818 Pdata_clear(self->stack, self->stack->length-2);
4819 PDATA_APPEND(self->stack, Py_None,-1);
4820 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004821}
4822
4823static int
4824noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004825
Guido van Rossum053b8df1998-11-25 16:18:00 +00004826 if (self->stack->length < 1) return stackUnderflow();
4827 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004828 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004829}
4830
Tim Peters2d629652003-02-04 05:06:17 +00004831static int
4832noload_extension(Unpicklerobject *self, int nbytes)
4833{
4834 char *codebytes;
4835
4836 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4837 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4838 PDATA_APPEND(self->stack, Py_None, -1);
4839 return 0;
4840}
4841
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004842
4843static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004844noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004845{
4846 PyObject *err = 0, *val = 0;
4847 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004849 self->num_marks = 0;
4850 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004851
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004852 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004853 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004854 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004855
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004856 switch (s[0]) {
4857 case NONE:
4858 if (load_none(self) < 0)
4859 break;
4860 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004862 case BININT:
4863 if (load_binint(self) < 0)
4864 break;
4865 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004867 case BININT1:
4868 if (load_binint1(self) < 0)
4869 break;
4870 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004871
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004872 case BININT2:
4873 if (load_binint2(self) < 0)
4874 break;
4875 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004877 case INT:
4878 if (load_int(self) < 0)
4879 break;
4880 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004881
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004882 case LONG:
4883 if (load_long(self) < 0)
4884 break;
4885 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004886
Tim Peters4190fb82003-02-02 16:09:05 +00004887 case LONG1:
4888 if (load_counted_long(self, 1) < 0)
4889 break;
4890 continue;
4891
4892 case LONG4:
4893 if (load_counted_long(self, 4) < 0)
4894 break;
4895 continue;
4896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004897 case FLOAT:
4898 if (load_float(self) < 0)
4899 break;
4900 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004901
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004902 case BINFLOAT:
4903 if (load_binfloat(self) < 0)
4904 break;
4905 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004906
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004907 case BINSTRING:
4908 if (load_binstring(self) < 0)
4909 break;
4910 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004911
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004912 case SHORT_BINSTRING:
4913 if (load_short_binstring(self) < 0)
4914 break;
4915 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004916
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004917 case STRING:
4918 if (load_string(self) < 0)
4919 break;
4920 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004921
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004922#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004923 case UNICODE:
4924 if (load_unicode(self) < 0)
4925 break;
4926 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004927
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004928 case BINUNICODE:
4929 if (load_binunicode(self) < 0)
4930 break;
4931 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004932#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004933
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004934 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004935 if (load_counted_tuple(self, 0) < 0)
4936 break;
4937 continue;
4938
4939 case TUPLE1:
4940 if (load_counted_tuple(self, 1) < 0)
4941 break;
4942 continue;
4943
4944 case TUPLE2:
4945 if (load_counted_tuple(self, 2) < 0)
4946 break;
4947 continue;
4948
4949 case TUPLE3:
4950 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004951 break;
4952 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004953
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004954 case TUPLE:
4955 if (load_tuple(self) < 0)
4956 break;
4957 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004958
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004959 case EMPTY_LIST:
4960 if (load_empty_list(self) < 0)
4961 break;
4962 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004964 case LIST:
4965 if (load_list(self) < 0)
4966 break;
4967 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004968
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004969 case EMPTY_DICT:
4970 if (load_empty_dict(self) < 0)
4971 break;
4972 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004973
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004974 case DICT:
4975 if (load_dict(self) < 0)
4976 break;
4977 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004978
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004979 case OBJ:
4980 if (noload_obj(self) < 0)
4981 break;
4982 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004983
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004984 case INST:
4985 if (noload_inst(self) < 0)
4986 break;
4987 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004988
Tim Peterseab7db32003-02-13 18:24:14 +00004989 case NEWOBJ:
4990 if (noload_newobj(self) < 0)
4991 break;
4992 continue;
4993
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004994 case GLOBAL:
4995 if (noload_global(self) < 0)
4996 break;
4997 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004998
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004999 case APPEND:
5000 if (load_append(self) < 0)
5001 break;
5002 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005004 case APPENDS:
5005 if (load_appends(self) < 0)
5006 break;
5007 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005008
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005009 case BUILD:
5010 if (noload_build(self) < 0)
5011 break;
5012 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005013
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005014 case DUP:
5015 if (load_dup(self) < 0)
5016 break;
5017 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005018
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005019 case BINGET:
5020 if (load_binget(self) < 0)
5021 break;
5022 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005024 case LONG_BINGET:
5025 if (load_long_binget(self) < 0)
5026 break;
5027 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005028
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005029 case GET:
5030 if (load_get(self) < 0)
5031 break;
5032 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005033
Tim Peters2d629652003-02-04 05:06:17 +00005034 case EXT1:
5035 if (noload_extension(self, 1) < 0)
5036 break;
5037 continue;
5038
5039 case EXT2:
5040 if (noload_extension(self, 2) < 0)
5041 break;
5042 continue;
5043
5044 case EXT4:
5045 if (noload_extension(self, 4) < 0)
5046 break;
5047 continue;
5048
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005049 case MARK:
5050 if (load_mark(self) < 0)
5051 break;
5052 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005053
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005054 case BINPUT:
5055 if (load_binput(self) < 0)
5056 break;
5057 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005059 case LONG_BINPUT:
5060 if (load_long_binput(self) < 0)
5061 break;
5062 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005063
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005064 case PUT:
5065 if (load_put(self) < 0)
5066 break;
5067 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005069 case POP:
5070 if (load_pop(self) < 0)
5071 break;
5072 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005073
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005074 case POP_MARK:
5075 if (load_pop_mark(self) < 0)
5076 break;
5077 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005078
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005079 case SETITEM:
5080 if (load_setitem(self) < 0)
5081 break;
5082 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005083
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005084 case SETITEMS:
5085 if (load_setitems(self) < 0)
5086 break;
5087 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005089 case STOP:
5090 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005091
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005092 case PERSID:
5093 if (load_persid(self) < 0)
5094 break;
5095 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005096
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005097 case BINPERSID:
5098 if (load_binpersid(self) < 0)
5099 break;
5100 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005101
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005102 case REDUCE:
5103 if (noload_reduce(self) < 0)
5104 break;
5105 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005106
Tim Peters4190fb82003-02-02 16:09:05 +00005107 case PROTO:
5108 if (load_proto(self) < 0)
5109 break;
5110 continue;
5111
Tim Peters3c67d792003-02-02 17:59:11 +00005112 case NEWTRUE:
5113 if (load_bool(self, Py_True) < 0)
5114 break;
5115 continue;
5116
5117 case NEWFALSE:
5118 if (load_bool(self, Py_False) < 0)
5119 break;
5120 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005121 default:
Tim Peterscba30e22003-02-01 06:24:36 +00005122 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005123 "invalid load key, '%s'.",
5124 "c", s[0]);
5125 return NULL;
5126 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005128 break;
5129 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005131 if ((err = PyErr_Occurred())) {
5132 if (err == PyExc_EOFError) {
5133 PyErr_SetNone(PyExc_EOFError);
5134 }
5135 return NULL;
5136 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005138 PDATA_POP(self->stack, val);
5139 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005140}
Tim Peters84e87f32001-03-17 04:50:51 +00005141
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005142
Guido van Rossum60456fd1997-04-09 17:36:32 +00005143static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005144Unpickler_load(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005145{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005146 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005147}
5148
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005149static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005150Unpickler_noload(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005151{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005152 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005153}
5154
Guido van Rossum60456fd1997-04-09 17:36:32 +00005155
5156static struct PyMethodDef Unpickler_methods[] = {
Georg Brandl96a8c392006-05-29 21:04:52 +00005157 {"load", (PyCFunction)Unpickler_load, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005158 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005159 },
Georg Brandl96a8c392006-05-29 21:04:52 +00005160 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005161 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005162 "noload() -- not load a pickle, but go through most of the motions\n"
5163 "\n"
5164 "This function can be used to read past a pickle without instantiating\n"
5165 "any objects or importing any modules. It can also be used to find all\n"
5166 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00005167 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005168 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00005169 {NULL, NULL} /* sentinel */
5170};
5171
5172
5173static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00005174newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005175{
5176 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005177
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005178 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005179 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005180
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005181 self->file = NULL;
5182 self->arg = NULL;
5183 self->stack = (Pdata*)Pdata_New();
5184 self->pers_func = NULL;
5185 self->last_string = NULL;
5186 self->marks = NULL;
5187 self->num_marks = 0;
5188 self->marks_size = 0;
5189 self->buf_size = 0;
5190 self->read = NULL;
5191 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005192 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005193
Tim Peterscba30e22003-02-01 06:24:36 +00005194 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005195 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005196
Neal Norwitzb59d08c2006-07-22 16:20:49 +00005197 if (!self->stack)
5198 goto err;
5199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005200 Py_INCREF(f);
5201 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005203 /* Set read, readline based on type of f */
5204 if (PyFile_Check(f)) {
5205 self->fp = PyFile_AsFile(f);
5206 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00005207 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005208 "I/O operation on closed file");
5209 goto err;
5210 }
5211 self->read_func = read_file;
5212 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00005213 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005214 else if (PycStringIO_InputCheck(f)) {
5215 self->fp = NULL;
5216 self->read_func = read_cStringIO;
5217 self->readline_func = readline_cStringIO;
5218 }
5219 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00005220
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005221 self->fp = NULL;
5222 self->read_func = read_other;
5223 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005224
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005225 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
5226 (self->read = PyObject_GetAttr(f, read_str)))) {
5227 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00005228 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005229 "argument must have 'read' and "
5230 "'readline' attributes" );
5231 goto err;
5232 }
5233 }
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005234 PyObject_GC_Track(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005235
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005236 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005237
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005238 err:
5239 Py_DECREF((PyObject *)self);
5240 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005241}
5242
5243
5244static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005245get_Unpickler(PyObject *self, PyObject *file)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005246{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005247 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005248}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005249
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005250
Guido van Rossum60456fd1997-04-09 17:36:32 +00005251static void
Tim Peterscba30e22003-02-01 06:24:36 +00005252Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005253{
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005254 PyObject_GC_UnTrack((PyObject *)self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005255 Py_XDECREF(self->readline);
5256 Py_XDECREF(self->read);
5257 Py_XDECREF(self->file);
5258 Py_XDECREF(self->memo);
5259 Py_XDECREF(self->stack);
5260 Py_XDECREF(self->pers_func);
5261 Py_XDECREF(self->arg);
5262 Py_XDECREF(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00005263 Py_XDECREF(self->find_class);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005264
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005265 if (self->marks) {
5266 free(self->marks);
5267 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005268
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005269 if (self->buf_size) {
5270 free(self->buf);
5271 }
Tim Peters84e87f32001-03-17 04:50:51 +00005272
Tim Peters3cfe7542003-05-21 21:29:48 +00005273 self->ob_type->tp_free((PyObject *)self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005274}
5275
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005276static int
5277Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
5278{
Thomas Woutersc6e55062006-04-15 21:47:09 +00005279 Py_VISIT(self->readline);
5280 Py_VISIT(self->read);
5281 Py_VISIT(self->file);
5282 Py_VISIT(self->memo);
5283 Py_VISIT(self->stack);
5284 Py_VISIT(self->pers_func);
5285 Py_VISIT(self->arg);
5286 Py_VISIT(self->last_string);
5287 Py_VISIT(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005288 return 0;
5289}
5290
5291static int
5292Unpickler_clear(Unpicklerobject *self)
5293{
Thomas Woutersedf17d82006-04-15 17:28:34 +00005294 Py_CLEAR(self->readline);
5295 Py_CLEAR(self->read);
5296 Py_CLEAR(self->file);
5297 Py_CLEAR(self->memo);
5298 Py_CLEAR(self->stack);
5299 Py_CLEAR(self->pers_func);
5300 Py_CLEAR(self->arg);
5301 Py_CLEAR(self->last_string);
5302 Py_CLEAR(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005303 return 0;
5304}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005305
5306static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005307Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005308{
5309 if (!strcmp(name, "persistent_load")) {
5310 if (!self->pers_func) {
5311 PyErr_SetString(PyExc_AttributeError, name);
5312 return NULL;
5313 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005314
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005315 Py_INCREF(self->pers_func);
5316 return self->pers_func;
5317 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005318
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005319 if (!strcmp(name, "find_global")) {
5320 if (!self->find_class) {
5321 PyErr_SetString(PyExc_AttributeError, name);
5322 return NULL;
5323 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005324
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005325 Py_INCREF(self->find_class);
5326 return self->find_class;
5327 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005328
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005329 if (!strcmp(name, "memo")) {
5330 if (!self->memo) {
5331 PyErr_SetString(PyExc_AttributeError, name);
5332 return NULL;
5333 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005334
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005335 Py_INCREF(self->memo);
5336 return self->memo;
5337 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005339 if (!strcmp(name, "UnpicklingError")) {
5340 Py_INCREF(UnpicklingError);
5341 return UnpicklingError;
5342 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005344 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005345}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005346
Guido van Rossum60456fd1997-04-09 17:36:32 +00005347
5348static int
Tim Peterscba30e22003-02-01 06:24:36 +00005349Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005350{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005351
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005352 if (!strcmp(name, "persistent_load")) {
5353 Py_XDECREF(self->pers_func);
5354 self->pers_func = value;
5355 Py_XINCREF(value);
5356 return 0;
5357 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005359 if (!strcmp(name, "find_global")) {
5360 Py_XDECREF(self->find_class);
5361 self->find_class = value;
5362 Py_XINCREF(value);
5363 return 0;
5364 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005365
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005366 if (! value) {
5367 PyErr_SetString(PyExc_TypeError,
5368 "attribute deletion is not supported");
5369 return -1;
5370 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005372 if (strcmp(name, "memo") == 0) {
5373 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005374 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005375 "memo must be a dictionary");
5376 return -1;
5377 }
5378 Py_XDECREF(self->memo);
5379 self->memo = value;
5380 Py_INCREF(value);
5381 return 0;
5382 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005383
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005384 PyErr_SetString(PyExc_AttributeError, name);
5385 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005386}
5387
Tim Peters5bd2a792003-02-01 16:45:06 +00005388/* ---------------------------------------------------------------------------
5389 * Module-level functions.
5390 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005391
Martin v. Löwis544f1192004-07-27 05:22:33 +00005392/* dump(obj, file, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005393static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005394cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005395{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005396 static char *kwlist[] = {"obj", "file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005397 PyObject *ob, *file, *res = NULL;
5398 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005399 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005400
Martin v. Löwis544f1192004-07-27 05:22:33 +00005401 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5402 &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005403 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005404
Tim Peters5bd2a792003-02-01 16:45:06 +00005405 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005406 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005408 if (dump(pickler, ob) < 0)
5409 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005411 Py_INCREF(Py_None);
5412 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005413
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005414 finally:
5415 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005417 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005418}
5419
5420
Martin v. Löwis544f1192004-07-27 05:22:33 +00005421/* dumps(obj, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005422static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005423cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005424{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005425 static char *kwlist[] = {"obj", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005426 PyObject *ob, *file = 0, *res = NULL;
5427 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005428 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005429
Martin v. Löwis544f1192004-07-27 05:22:33 +00005430 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5431 &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005432 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005433
Tim Peterscba30e22003-02-01 06:24:36 +00005434 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005435 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005436
Tim Peters5bd2a792003-02-01 16:45:06 +00005437 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005438 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005440 if (dump(pickler, ob) < 0)
5441 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005443 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005445 finally:
5446 Py_XDECREF(pickler);
5447 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005448
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005449 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005450}
5451
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005452
Tim Peters5bd2a792003-02-01 16:45:06 +00005453/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005454static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005455cpm_load(PyObject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005456{
5457 Unpicklerobject *unpickler = 0;
Georg Brandl96a8c392006-05-29 21:04:52 +00005458 PyObject *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005459
Tim Peterscba30e22003-02-01 06:24:36 +00005460 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005461 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005462
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005463 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005465 finally:
5466 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005467
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005468 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005469}
5470
5471
Tim Peters5bd2a792003-02-01 16:45:06 +00005472/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005473static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005474cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005475{
5476 PyObject *ob, *file = 0, *res = NULL;
5477 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005478
Tim Peterscba30e22003-02-01 06:24:36 +00005479 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005480 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005481
Tim Peterscba30e22003-02-01 06:24:36 +00005482 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005483 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005484
Tim Peterscba30e22003-02-01 06:24:36 +00005485 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005486 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005487
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005488 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005490 finally:
5491 Py_XDECREF(file);
5492 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005493
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005494 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005495}
5496
5497
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005498PyDoc_STRVAR(Unpicklertype__doc__,
5499"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005500
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005501static PyTypeObject Unpicklertype = {
5502 PyObject_HEAD_INIT(NULL)
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005503 0, /*ob_size*/
5504 "cPickle.Unpickler", /*tp_name*/
5505 sizeof(Unpicklerobject), /*tp_basicsize*/
5506 0,
5507 (destructor)Unpickler_dealloc, /* tp_dealloc */
5508 0, /* tp_print */
5509 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5510 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5511 0, /* tp_compare */
5512 0, /* tp_repr */
5513 0, /* tp_as_number */
5514 0, /* tp_as_sequence */
5515 0, /* tp_as_mapping */
5516 0, /* tp_hash */
5517 0, /* tp_call */
5518 0, /* tp_str */
5519 0, /* tp_getattro */
5520 0, /* tp_setattro */
5521 0, /* tp_as_buffer */
5522 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5523 Unpicklertype__doc__, /* tp_doc */
5524 (traverseproc)Unpickler_traverse, /* tp_traverse */
5525 (inquiry)Unpickler_clear, /* tp_clear */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005526};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005527
Guido van Rossum60456fd1997-04-09 17:36:32 +00005528static struct PyMethodDef cPickle_methods[] = {
Martin v. Löwis544f1192004-07-27 05:22:33 +00005529 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5530 PyDoc_STR("dump(obj, file, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005531 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005532 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005533 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005534 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005535
Martin v. Löwis544f1192004-07-27 05:22:33 +00005536 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5537 PyDoc_STR("dumps(obj, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005538 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005539 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005540 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005541 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005542
Georg Brandl96a8c392006-05-29 21:04:52 +00005543 {"load", (PyCFunction)cpm_load, METH_O,
Neal Norwitz200788c2002-08-13 22:20:41 +00005544 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005545
Neal Norwitzb0493252002-03-31 14:44:22 +00005546 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005547 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005548
Martin v. Löwis544f1192004-07-27 05:22:33 +00005549 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5550 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005551 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005552 "This takes a file-like object for writing a pickle data stream.\n"
5553 "The optional proto argument tells the pickler to use the given\n"
5554 "protocol; supported protocols are 0, 1, 2. The default\n"
5555 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5556 "only protocol that can be written to a file opened in text\n"
5557 "mode and read back successfully. When using a protocol higher\n"
5558 "than 0, make sure the file is opened in binary mode, both when\n"
5559 "pickling and unpickling.)\n"
5560 "\n"
5561 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5562 "more efficient than protocol 1.\n"
5563 "\n"
5564 "Specifying a negative protocol version selects the highest\n"
5565 "protocol version supported. The higher the protocol used, the\n"
5566 "more recent the version of Python needed to read the pickle\n"
5567 "produced.\n"
5568 "\n"
5569 "The file parameter must have a write() method that accepts a single\n"
5570 "string argument. It can thus be an open file object, a StringIO\n"
5571 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005572 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005573
Georg Brandl96a8c392006-05-29 21:04:52 +00005574 {"Unpickler", (PyCFunction)get_Unpickler, METH_O,
Tim Peters5bd2a792003-02-01 16:45:06 +00005575 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5576
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005577 { NULL, NULL }
5578};
5579
Guido van Rossum60456fd1997-04-09 17:36:32 +00005580static int
Tim Peterscba30e22003-02-01 06:24:36 +00005581init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005582{
5583 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005584
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00005585#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005586
Tim Peters3cfe7542003-05-21 21:29:48 +00005587 if (PyType_Ready(&Unpicklertype) < 0)
5588 return -1;
5589 if (PyType_Ready(&Picklertype) < 0)
5590 return -1;
5591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005592 INIT_STR(__class__);
5593 INIT_STR(__getinitargs__);
5594 INIT_STR(__dict__);
5595 INIT_STR(__getstate__);
5596 INIT_STR(__setstate__);
5597 INIT_STR(__name__);
5598 INIT_STR(__main__);
5599 INIT_STR(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00005600 INIT_STR(__reduce_ex__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005601 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005602 INIT_STR(append);
5603 INIT_STR(read);
5604 INIT_STR(readline);
5605 INIT_STR(copy_reg);
5606 INIT_STR(dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005607
Tim Peterscba30e22003-02-01 06:24:36 +00005608 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005609 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005610
Tim Peters1f1b2d22003-02-01 02:16:37 +00005611 /* This is special because we want to use a different
5612 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005613 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005614 if (!dispatch_table) return -1;
5615
5616 extension_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005617 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005618 if (!extension_registry) return -1;
5619
5620 inverted_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005621 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005622 if (!inverted_registry) return -1;
5623
5624 extension_cache = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005625 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005626 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005628 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005629
Tim Peters731098b2003-02-04 20:56:09 +00005630 if (!(empty_tuple = PyTuple_New(0)))
5631 return -1;
5632
5633 two_tuple = PyTuple_New(2);
5634 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005635 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005636 /* We use this temp container with no regard to refcounts, or to
5637 * keeping containees alive. Exempt from GC, because we don't
5638 * want anything looking at two_tuple() by magic.
5639 */
5640 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005641
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005642 /* Ugh */
5643 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5644 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5645 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005646
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005647 if (!( t=PyDict_New())) return -1;
5648 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005649 "def __str__(self):\n"
5650 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5651 Py_file_input,
5652 module_dict, t) )) return -1;
5653 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005654
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005655 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005656 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005657 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005658
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005659 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005660
Tim Peterscba30e22003-02-01 06:24:36 +00005661 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005662 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005663 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005664 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005665
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005666 if (!( t=PyDict_New())) return -1;
5667 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005668 "def __str__(self):\n"
5669 " a=self.args\n"
5670 " a=a and type(a[0]) or '(what)'\n"
5671 " return 'Cannot pickle %s objects' % a\n"
5672 , Py_file_input,
5673 module_dict, t) )) return -1;
5674 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005675
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005676 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005677 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005678 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005680 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005681
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005682 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005683 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005684 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005685
Martin v. Löwis658009a2002-09-16 17:26:24 +00005686 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5687 UnpicklingError, NULL)))
5688 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005690 if (PyDict_SetItemString(module_dict, "PickleError",
5691 PickleError) < 0)
5692 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005694 if (PyDict_SetItemString(module_dict, "PicklingError",
5695 PicklingError) < 0)
5696 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005698 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5699 UnpicklingError) < 0)
5700 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005702 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5703 UnpickleableError) < 0)
5704 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005706 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5707 BadPickleGet) < 0)
5708 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005710 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005711
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005712 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005713}
5714
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005715#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5716#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005717#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005718PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005719initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005720{
5721 PyObject *m, *d, *di, *v, *k;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005722 Py_ssize_t i;
Tim Peters5b7da392003-02-04 00:21:07 +00005723 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005724 PyObject *format_version;
5725 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005727 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005728 Unpicklertype.ob_type = &PyType_Type;
5729 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005730
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005731 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005732 * so we're forced to use a temporary dictionary. :(
5733 */
5734 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005735 if (!di) return;
5736 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005738 /* Create the module and add the functions */
5739 m = Py_InitModule4("cPickle", cPickle_methods,
5740 cPickle_module_documentation,
5741 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00005742 if (m == NULL)
5743 return;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005745 /* Add some symbolic constants to the module */
5746 d = PyModule_GetDict(m);
Tim Peters5b7da392003-02-04 00:21:07 +00005747 v = PyString_FromString(rev);
5748 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005749 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005750
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005751 /* Copy data from di. Waaa. */
5752 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5753 if (PyObject_SetItem(d, k, v) < 0) {
5754 Py_DECREF(di);
5755 return;
5756 }
5757 }
5758 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005759
Tim Peters8587b3c2003-02-13 15:44:41 +00005760 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
5761 if (i < 0)
5762 return;
5763
Tim Peters5b7da392003-02-04 00:21:07 +00005764 /* These are purely informational; no code uses them. */
5765 /* File format version we write. */
5766 format_version = PyString_FromString("2.0");
5767 /* Format versions we can read. */
5768 compatible_formats = Py_BuildValue("[sssss]",
5769 "1.0", /* Original protocol 0 */
5770 "1.1", /* Protocol 0 + INST */
5771 "1.2", /* Original protocol 1 */
5772 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005773 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005774 PyDict_SetItemString(d, "format_version", format_version);
5775 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5776 Py_XDECREF(format_version);
5777 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005778}