blob: 2a05c0645e4e57057b382c36ad5ec274ce2906f9 [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öwis68192102007-07-21 06:55:02 +0000154 PyVarObject_HEAD_INIT(NULL, 0) "cPickle.Pdata", sizeof(Pdata), 0,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000155 (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
Christian Heimese93237d2007-12-19 02:37:44 +0000159#define Pdata_Check(O) (Py_TYPE(O) == &PdataType)
Guido van Rossum053b8df1998-11-25 16:18:00 +0000160
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) { \
Christian Heimese93237d2007-12-19 02:37:44 +0000319 if (Py_REFCNT(self->arg) > 1) { \
Guido van Rossum053b8df1998-11-25 16:18:00 +0000320 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ónsson17b8e972007-04-25 00:10:50 +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ónsson17b8e972007-04-25 00:10:50 +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ónsson17b8e972007-04-25 00:10:50 +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ónsson17b8e972007-04-25 00:10:50 +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ónsson17b8e972007-04-25 00:10:50 +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{
Christian Heimese93237d2007-12-19 02:37:44 +0000755 if (Py_REFCNT(ob) < 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",
Christian Heimese93237d2007-12-19 02:37:44 +0000919 Py_TYPE(obj)->tp_name, obj);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000920 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 Rigo7ccbca92006-10-04 12:17:45 +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 Rigo7ccbca92006-10-04 12:17:45 +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 Rigo7ccbca92006-10-04 12:17:45 +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 Rigo7ccbca92006-10-04 12:17:45 +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 Rigo7ccbca92006-10-04 12:17:45 +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 Rigo7ccbca92006-10-04 12:17:45 +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 Norwitz5a29dd32007-10-05 05:01:38 +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
Christian Heimese93237d2007-12-19 02:37:44 +00002323 type = Py_TYPE(args);
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
Christian Heimese93237d2007-12-19 02:37:44 +00002375 if (Py_REFCNT(args) > 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);
Christian Heimese93237d2007-12-19 02:37:44 +00002916 Py_TYPE(self)->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 = {
Martin v. Löwis68192102007-07-21 06:55:02 +00003040 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00003041 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003042 sizeof(Picklerobject), /*tp_basicsize*/
3043 0,
3044 (destructor)Pickler_dealloc, /* tp_dealloc */
3045 0, /* tp_print */
3046 0, /* tp_getattr */
3047 0, /* tp_setattr */
3048 0, /* tp_compare */
3049 0, /* tp_repr */
3050 0, /* tp_as_number */
3051 0, /* tp_as_sequence */
3052 0, /* tp_as_mapping */
3053 0, /* tp_hash */
3054 0, /* tp_call */
3055 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00003056 PyObject_GenericGetAttr, /* tp_getattro */
3057 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003058 0, /* tp_as_buffer */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003059 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003060 Picklertype__doc__, /* tp_doc */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003061 (traverseproc)Pickler_traverse, /* tp_traverse */
3062 (inquiry)Pickler_clear, /* tp_clear */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003063 0, /* tp_richcompare */
3064 0, /* tp_weaklistoffset */
3065 0, /* tp_iter */
3066 0, /* tp_iternext */
3067 Pickler_methods, /* tp_methods */
3068 Pickler_members, /* tp_members */
3069 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003070};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003071
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003072static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003073find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003074{
3075 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003076
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003077 if (fc) {
3078 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00003079 PyErr_SetString(UnpicklingError, "Global and instance "
3080 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003081 return NULL;
3082 }
Georg Brandl684fd0c2006-05-25 19:15:31 +00003083 return PyObject_CallFunctionObjArgs(fc, py_module_name,
3084 py_global_name, NULL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003085 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00003086
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003087 module = PySys_GetObject("modules");
3088 if (module == NULL)
3089 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00003090
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003091 module = PyDict_GetItem(module, py_module_name);
3092 if (module == NULL) {
3093 module = PyImport_Import(py_module_name);
3094 if (!module)
3095 return NULL;
3096 global = PyObject_GetAttr(module, py_global_name);
3097 Py_DECREF(module);
3098 }
3099 else
3100 global = PyObject_GetAttr(module, py_global_name);
3101 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003102}
3103
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003104static int
Tim Peterscba30e22003-02-01 06:24:36 +00003105marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003106{
3107 if (self->num_marks < 1) {
3108 PyErr_SetString(UnpicklingError, "could not find MARK");
3109 return -1;
3110 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003111
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003112 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003113}
3114
Tim Peters84e87f32001-03-17 04:50:51 +00003115
Guido van Rossum60456fd1997-04-09 17:36:32 +00003116static int
Tim Peterscba30e22003-02-01 06:24:36 +00003117load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003118{
3119 PDATA_APPEND(self->stack, Py_None, -1);
3120 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003121}
3122
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003123static int
Tim Peterscba30e22003-02-01 06:24:36 +00003124bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003125{
3126 PyErr_SetString(UnpicklingError, "pickle data was truncated");
3127 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003128}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003129
3130static int
Tim Peterscba30e22003-02-01 06:24:36 +00003131load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003132{
3133 PyObject *py_int = 0;
3134 char *endptr, *s;
3135 int len, res = -1;
3136 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003137
Tim Peters0bc93f52003-02-02 18:29:33 +00003138 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003139 if (len < 2) return bad_readline();
3140 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003142 errno = 0;
3143 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003144
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003145 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
3146 /* Hm, maybe we've got something long. Let's try reading
3147 it as a Python long object. */
3148 errno = 0;
3149 py_int = PyLong_FromString(s, NULL, 0);
3150 if (py_int == NULL) {
3151 PyErr_SetString(PyExc_ValueError,
3152 "could not convert string to int");
3153 goto finally;
3154 }
3155 }
3156 else {
Guido van Rossume2763392002-04-05 19:30:08 +00003157 if (len == 3 && (l == 0 || l == 1)) {
3158 if (!( py_int = PyBool_FromLong(l))) goto finally;
3159 }
3160 else {
3161 if (!( py_int = PyInt_FromLong(l))) goto finally;
3162 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003163 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003164
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003165 free(s);
3166 PDATA_PUSH(self->stack, py_int, -1);
3167 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003168
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003169 finally:
3170 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003172 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003173}
3174
Tim Peters3c67d792003-02-02 17:59:11 +00003175static int
3176load_bool(Unpicklerobject *self, PyObject *boolean)
3177{
3178 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00003179 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00003180 return 0;
3181}
3182
Tim Petersee1a53c2003-02-02 02:57:53 +00003183/* s contains x bytes of a little-endian integer. Return its value as a
3184 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3185 * int, but when x is 4 it's a signed one. This is an historical source
3186 * of x-platform bugs.
3187 */
Tim Peters84e87f32001-03-17 04:50:51 +00003188static long
Tim Petersee1a53c2003-02-02 02:57:53 +00003189calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003190{
3191 unsigned char c;
3192 int i;
3193 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003195 for (i = 0, l = 0L; i < x; i++) {
3196 c = (unsigned char)s[i];
3197 l |= (long)c << (i * 8);
3198 }
Tim Petersbfa18f72001-04-10 01:54:42 +00003199#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003200 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3201 * is signed, so on a box with longs bigger than 4 bytes we need
3202 * to extend a BININT's sign bit to the full width.
3203 */
3204 if (x == 4 && l & (1L << 31))
3205 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00003206#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003207 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003208}
3209
3210
3211static int
Tim Peterscba30e22003-02-01 06:24:36 +00003212load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003213{
3214 PyObject *py_int = 0;
3215 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003217 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003218
Tim Peterscba30e22003-02-01 06:24:36 +00003219 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003220 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003221
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003222 PDATA_PUSH(self->stack, py_int, -1);
3223 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003224}
3225
3226
3227static int
Tim Peterscba30e22003-02-01 06:24:36 +00003228load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003229{
3230 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003231
Tim Peters0bc93f52003-02-02 18:29:33 +00003232 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003233 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003234
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003235 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003236}
3237
3238
3239static int
Tim Peterscba30e22003-02-01 06:24:36 +00003240load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003241{
3242 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003243
Tim Peters0bc93f52003-02-02 18:29:33 +00003244 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003245 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003247 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003248}
3249
3250
3251static int
Tim Peterscba30e22003-02-01 06:24:36 +00003252load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003253{
3254 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003255
Tim Peters0bc93f52003-02-02 18:29:33 +00003256 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003257 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003258
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003259 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003260}
Tim Peters84e87f32001-03-17 04:50:51 +00003261
Guido van Rossum60456fd1997-04-09 17:36:32 +00003262static int
Tim Peterscba30e22003-02-01 06:24:36 +00003263load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003264{
3265 PyObject *l = 0;
3266 char *end, *s;
3267 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003268
Tim Peters0bc93f52003-02-02 18:29:33 +00003269 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003270 if (len < 2) return bad_readline();
3271 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003272
Tim Peterscba30e22003-02-01 06:24:36 +00003273 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003274 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003275
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003276 free(s);
3277 PDATA_PUSH(self->stack, l, -1);
3278 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003279
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003280 finally:
3281 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003282
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003283 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003284}
3285
Tim Petersee1a53c2003-02-02 02:57:53 +00003286/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3287 * data following.
3288 */
3289static int
3290load_counted_long(Unpicklerobject *self, int size)
3291{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003292 Py_ssize_t i;
Tim Petersee1a53c2003-02-02 02:57:53 +00003293 char *nbytes;
3294 unsigned char *pdata;
3295 PyObject *along;
3296
3297 assert(size == 1 || size == 4);
3298 i = self->read_func(self, &nbytes, size);
3299 if (i < 0) return -1;
3300
3301 size = calc_binint(nbytes, size);
3302 if (size < 0) {
3303 /* Corrupt or hostile pickle -- we never write one like
3304 * this.
3305 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003306 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003307 "byte count");
3308 return -1;
3309 }
3310
3311 if (size == 0)
3312 along = PyLong_FromLong(0L);
3313 else {
3314 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003315 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003316 if (i < 0) return -1;
3317 along = _PyLong_FromByteArray(pdata, (size_t)size,
3318 1 /* little endian */, 1 /* signed */);
3319 }
3320 if (along == NULL)
3321 return -1;
3322 PDATA_PUSH(self->stack, along, -1);
3323 return 0;
3324}
Tim Peters84e87f32001-03-17 04:50:51 +00003325
Guido van Rossum60456fd1997-04-09 17:36:32 +00003326static int
Tim Peterscba30e22003-02-01 06:24:36 +00003327load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003328{
3329 PyObject *py_float = 0;
3330 char *endptr, *s;
3331 int len, res = -1;
3332 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003333
Tim Peters0bc93f52003-02-02 18:29:33 +00003334 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003335 if (len < 2) return bad_readline();
3336 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003338 errno = 0;
Martin v. Löwis737ea822004-06-08 18:52:54 +00003339 d = PyOS_ascii_strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003341 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3342 PyErr_SetString(PyExc_ValueError,
3343 "could not convert string to float");
3344 goto finally;
3345 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003346
Tim Peterscba30e22003-02-01 06:24:36 +00003347 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003348 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003349
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003350 free(s);
3351 PDATA_PUSH(self->stack, py_float, -1);
3352 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003353
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003354 finally:
3355 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003356
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003357 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003358}
3359
Guido van Rossum60456fd1997-04-09 17:36:32 +00003360static int
Tim Peterscba30e22003-02-01 06:24:36 +00003361load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003362{
Tim Peters9905b942003-03-20 20:53:32 +00003363 PyObject *py_float;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003364 double x;
3365 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003366
Tim Peters0bc93f52003-02-02 18:29:33 +00003367 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003368 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003369
Tim Peters9905b942003-03-20 20:53:32 +00003370 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3371 if (x == -1.0 && PyErr_Occurred())
3372 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003373
Tim Peters9905b942003-03-20 20:53:32 +00003374 py_float = PyFloat_FromDouble(x);
3375 if (py_float == NULL)
3376 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003377
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003378 PDATA_PUSH(self->stack, py_float, -1);
3379 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003380}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003381
3382static int
Tim Peterscba30e22003-02-01 06:24:36 +00003383load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003384{
3385 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003386 int len, res = -1;
3387 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003388
Tim Peters0bc93f52003-02-02 18:29:33 +00003389 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003390 if (len < 2) return bad_readline();
3391 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003392
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003393
3394 /* Strip outermost quotes */
3395 while (s[len-1] <= ' ')
3396 len--;
3397 if(s[0]=='"' && s[len-1]=='"'){
3398 s[len-1] = '\0';
3399 p = s + 1 ;
3400 len -= 2;
3401 } else if(s[0]=='\'' && s[len-1]=='\''){
3402 s[len-1] = '\0';
3403 p = s + 1 ;
3404 len -= 2;
3405 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003406 goto insecure;
3407 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003408
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003409 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
Neal Norwitz99dfe3c2006-08-02 04:27:11 +00003410 free(s);
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003411 if (str) {
3412 PDATA_PUSH(self->stack, str, -1);
3413 res = 0;
3414 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003415 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003417 insecure:
3418 free(s);
3419 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3420 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003421}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003422
3423
3424static int
Tim Peterscba30e22003-02-01 06:24:36 +00003425load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003426{
3427 PyObject *py_string = 0;
3428 long l;
3429 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003430
Tim Peters0bc93f52003-02-02 18:29:33 +00003431 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003433 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003434
Tim Peters0bc93f52003-02-02 18:29:33 +00003435 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003436 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003437
Tim Peterscba30e22003-02-01 06:24:36 +00003438 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003439 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003441 PDATA_PUSH(self->stack, py_string, -1);
3442 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003443}
3444
3445
3446static int
Tim Peterscba30e22003-02-01 06:24:36 +00003447load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003448{
3449 PyObject *py_string = 0;
3450 unsigned char l;
3451 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003452
Tim Peters0bc93f52003-02-02 18:29:33 +00003453 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003454 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003455
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003456 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003457
Tim Peters0bc93f52003-02-02 18:29:33 +00003458 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003460 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003461
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003462 PDATA_PUSH(self->stack, py_string, -1);
3463 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003464}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003465
3466
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003467#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003468static int
Tim Peterscba30e22003-02-01 06:24:36 +00003469load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003470{
3471 PyObject *str = 0;
3472 int len, res = -1;
3473 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003474
Tim Peters0bc93f52003-02-02 18:29:33 +00003475 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003476 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003477
Tim Peterscba30e22003-02-01 06:24:36 +00003478 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003479 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003480
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003481 PDATA_PUSH(self->stack, str, -1);
3482 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003483
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003484 finally:
3485 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003486}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003487#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003488
3489
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003490#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003491static int
Tim Peterscba30e22003-02-01 06:24:36 +00003492load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003493{
3494 PyObject *unicode;
3495 long l;
3496 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003497
Tim Peters0bc93f52003-02-02 18:29:33 +00003498 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003499
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003500 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003501
Tim Peters0bc93f52003-02-02 18:29:33 +00003502 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003503 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003504
Tim Peterscba30e22003-02-01 06:24:36 +00003505 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003506 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003508 PDATA_PUSH(self->stack, unicode, -1);
3509 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003510}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003511#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003512
3513
3514static int
Tim Peterscba30e22003-02-01 06:24:36 +00003515load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003516{
3517 PyObject *tup;
3518 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003519
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003520 if ((i = marker(self)) < 0) return -1;
3521 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3522 PDATA_PUSH(self->stack, tup, -1);
3523 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003524}
3525
3526static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003527load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003528{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003529 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003530
Tim Peters1d63c9f2003-02-02 20:29:39 +00003531 if (tup == NULL)
3532 return -1;
3533
3534 while (--len >= 0) {
3535 PyObject *element;
3536
3537 PDATA_POP(self->stack, element);
3538 if (element == NULL)
3539 return -1;
3540 PyTuple_SET_ITEM(tup, len, element);
3541 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003542 PDATA_PUSH(self->stack, tup, -1);
3543 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003544}
3545
3546static int
Tim Peterscba30e22003-02-01 06:24:36 +00003547load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003548{
3549 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003550
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003551 if (!( list=PyList_New(0))) return -1;
3552 PDATA_PUSH(self->stack, list, -1);
3553 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003554}
3555
3556static int
Tim Peterscba30e22003-02-01 06:24:36 +00003557load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003558{
3559 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003560
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003561 if (!( dict=PyDict_New())) return -1;
3562 PDATA_PUSH(self->stack, dict, -1);
3563 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003564}
3565
3566
3567static int
Tim Peterscba30e22003-02-01 06:24:36 +00003568load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003569{
3570 PyObject *list = 0;
3571 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003572
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003573 if ((i = marker(self)) < 0) return -1;
3574 if (!( list=Pdata_popList(self->stack, i))) return -1;
3575 PDATA_PUSH(self->stack, list, -1);
3576 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003577}
3578
3579static int
Tim Peterscba30e22003-02-01 06:24:36 +00003580load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003581{
3582 PyObject *dict, *key, *value;
3583 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003585 if ((i = marker(self)) < 0) return -1;
3586 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003588 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003589
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003590 for (k = i+1; k < j; k += 2) {
3591 key =self->stack->data[k-1];
3592 value=self->stack->data[k ];
3593 if (PyDict_SetItem(dict, key, value) < 0) {
3594 Py_DECREF(dict);
3595 return -1;
3596 }
3597 }
3598 Pdata_clear(self->stack, i);
3599 PDATA_PUSH(self->stack, dict, -1);
3600 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003601}
3602
3603static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003604Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003605{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003606 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003608 if (PyClass_Check(cls)) {
3609 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003611 if ((l=PyObject_Size(args)) < 0) goto err;
3612 if (!( l )) {
3613 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003614
Tim Peterscba30e22003-02-01 06:24:36 +00003615 __getinitargs__ = PyObject_GetAttr(cls,
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00003616 __getinitargs___str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003617 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003618 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003619 so bypass usual construction */
3620 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003622 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003623 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003624 goto err;
3625 return inst;
3626 }
3627 Py_DECREF(__getinitargs__);
3628 }
Tim Peters84e87f32001-03-17 04:50:51 +00003629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003630 if ((r=PyInstance_New(cls, args, NULL))) return r;
3631 else goto err;
3632 }
Tim Peters84e87f32001-03-17 04:50:51 +00003633
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003634 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003635
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003636 err:
3637 {
Neal Norwitz0f8b31a2006-06-28 06:28:31 +00003638 PyObject *tp, *v, *tb, *tmp_value;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003639
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003640 PyErr_Fetch(&tp, &v, &tb);
Neal Norwitz0f8b31a2006-06-28 06:28:31 +00003641 tmp_value = v;
3642 /* NULL occurs when there was a KeyboardInterrupt */
3643 if (tmp_value == NULL)
3644 tmp_value = Py_None;
3645 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003646 Py_XDECREF(v);
3647 v=r;
3648 }
3649 PyErr_Restore(tp,v,tb);
3650 }
3651 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003652}
Tim Peters84e87f32001-03-17 04:50:51 +00003653
Guido van Rossum60456fd1997-04-09 17:36:32 +00003654
3655static int
Tim Peterscba30e22003-02-01 06:24:36 +00003656load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003657{
3658 PyObject *class, *tup, *obj=0;
3659 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003660
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003661 if ((i = marker(self)) < 0) return -1;
3662 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3663 PDATA_POP(self->stack, class);
3664 if (class) {
3665 obj = Instance_New(class, tup);
3666 Py_DECREF(class);
3667 }
3668 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003669
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003670 if (! obj) return -1;
3671 PDATA_PUSH(self->stack, obj, -1);
3672 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003673}
3674
3675
3676static int
Tim Peterscba30e22003-02-01 06:24:36 +00003677load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003678{
3679 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3680 int i, len;
3681 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003683 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003684
Tim Peters0bc93f52003-02-02 18:29:33 +00003685 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003686 if (len < 2) return bad_readline();
3687 module_name = PyString_FromStringAndSize(s, len - 1);
3688 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003689
Tim Peters0bc93f52003-02-02 18:29:33 +00003690 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003691 if (len < 2) return bad_readline();
3692 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003693 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003694 self->find_class);
3695 Py_DECREF(class_name);
3696 }
3697 }
3698 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003700 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003702 if ((tup=Pdata_popTuple(self->stack, i))) {
3703 obj = Instance_New(class, tup);
3704 Py_DECREF(tup);
3705 }
3706 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003708 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003710 PDATA_PUSH(self->stack, obj, -1);
3711 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003712}
3713
Tim Peterseab7db32003-02-13 18:24:14 +00003714static int
3715load_newobj(Unpicklerobject *self)
3716{
3717 PyObject *args = NULL;
3718 PyObject *clsraw = NULL;
3719 PyTypeObject *cls; /* clsraw cast to its true type */
3720 PyObject *obj;
3721
3722 /* Stack is ... cls argtuple, and we want to call
3723 * cls.__new__(cls, *argtuple).
3724 */
3725 PDATA_POP(self->stack, args);
3726 if (args == NULL) goto Fail;
3727 if (! PyTuple_Check(args)) {
3728 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3729 "tuple.");
3730 goto Fail;
3731 }
3732
3733 PDATA_POP(self->stack, clsraw);
3734 cls = (PyTypeObject *)clsraw;
3735 if (cls == NULL) goto Fail;
3736 if (! PyType_Check(cls)) {
3737 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3738 "isn't a type object");
3739 goto Fail;
3740 }
3741 if (cls->tp_new == NULL) {
3742 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3743 "has NULL tp_new");
3744 goto Fail;
3745 }
3746
3747 /* Call __new__. */
3748 obj = cls->tp_new(cls, args, NULL);
3749 if (obj == NULL) goto Fail;
3750
3751 Py_DECREF(args);
3752 Py_DECREF(clsraw);
3753 PDATA_PUSH(self->stack, obj, -1);
3754 return 0;
3755
3756 Fail:
3757 Py_XDECREF(args);
3758 Py_XDECREF(clsraw);
3759 return -1;
3760}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003761
3762static int
Tim Peterscba30e22003-02-01 06:24:36 +00003763load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003764{
3765 PyObject *class = 0, *module_name = 0, *class_name = 0;
3766 int len;
3767 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003768
Tim Peters0bc93f52003-02-02 18:29:33 +00003769 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003770 if (len < 2) return bad_readline();
3771 module_name = PyString_FromStringAndSize(s, len - 1);
3772 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003773
Tim Peters0bc93f52003-02-02 18:29:33 +00003774 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003775 if (len < 2) {
3776 Py_DECREF(module_name);
3777 return bad_readline();
3778 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003779 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003780 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003781 self->find_class);
3782 Py_DECREF(class_name);
3783 }
3784 }
3785 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003786
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003787 if (! class) return -1;
3788 PDATA_PUSH(self->stack, class, -1);
3789 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003790}
3791
3792
3793static int
Tim Peterscba30e22003-02-01 06:24:36 +00003794load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003795{
3796 PyObject *pid = 0;
3797 int len;
3798 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003799
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003800 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003801 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003802 if (len < 2) return bad_readline();
3803
3804 pid = PyString_FromStringAndSize(s, len - 1);
3805 if (!pid) return -1;
3806
3807 if (PyList_Check(self->pers_func)) {
3808 if (PyList_Append(self->pers_func, pid) < 0) {
3809 Py_DECREF(pid);
3810 return -1;
3811 }
3812 }
3813 else {
3814 ARG_TUP(self, pid);
3815 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003816 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003817 NULL);
3818 FREE_ARG_TUP(self);
3819 }
3820 }
3821
3822 if (! pid) return -1;
3823
3824 PDATA_PUSH(self->stack, pid, -1);
3825 return 0;
3826 }
3827 else {
3828 PyErr_SetString(UnpicklingError,
3829 "A load persistent id instruction was encountered,\n"
3830 "but no persistent_load function was specified.");
3831 return -1;
3832 }
3833}
3834
3835static int
Tim Peterscba30e22003-02-01 06:24:36 +00003836load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003837{
3838 PyObject *pid = 0;
3839
3840 if (self->pers_func) {
3841 PDATA_POP(self->stack, pid);
3842 if (! pid) return -1;
3843
3844 if (PyList_Check(self->pers_func)) {
3845 if (PyList_Append(self->pers_func, pid) < 0) {
3846 Py_DECREF(pid);
3847 return -1;
3848 }
3849 }
3850 else {
3851 ARG_TUP(self, pid);
3852 if (self->arg) {
3853 pid = PyObject_Call(self->pers_func, self->arg,
3854 NULL);
3855 FREE_ARG_TUP(self);
3856 }
3857 if (! pid) return -1;
3858 }
3859
3860 PDATA_PUSH(self->stack, pid, -1);
3861 return 0;
3862 }
3863 else {
3864 PyErr_SetString(UnpicklingError,
3865 "A load persistent id instruction was encountered,\n"
3866 "but no persistent_load function was specified.");
3867 return -1;
3868 }
3869}
3870
3871
3872static int
Tim Peterscba30e22003-02-01 06:24:36 +00003873load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003874{
3875 int len;
3876
3877 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3878
3879 /* Note that we split the (pickle.py) stack into two stacks,
3880 an object stack and a mark stack. We have to be clever and
3881 pop the right one. We do this by looking at the top of the
3882 mark stack.
3883 */
3884
3885 if ((self->num_marks > 0) &&
3886 (self->marks[self->num_marks - 1] == len))
3887 self->num_marks--;
3888 else {
3889 len--;
3890 Py_DECREF(self->stack->data[len]);
3891 self->stack->length=len;
3892 }
3893
3894 return 0;
3895}
3896
3897
3898static int
Tim Peterscba30e22003-02-01 06:24:36 +00003899load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003900{
3901 int i;
3902
3903 if ((i = marker(self)) < 0)
3904 return -1;
3905
3906 Pdata_clear(self->stack, i);
3907
3908 return 0;
3909}
3910
3911
3912static int
Tim Peterscba30e22003-02-01 06:24:36 +00003913load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003914{
3915 PyObject *last;
3916 int len;
3917
3918 if ((len = self->stack->length) <= 0) return stackUnderflow();
3919 last=self->stack->data[len-1];
3920 Py_INCREF(last);
3921 PDATA_PUSH(self->stack, last, -1);
3922 return 0;
3923}
3924
3925
3926static int
Tim Peterscba30e22003-02-01 06:24:36 +00003927load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003928{
3929 PyObject *py_str = 0, *value = 0;
3930 int len;
3931 char *s;
3932 int rc;
3933
Tim Peters0bc93f52003-02-02 18:29:33 +00003934 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003935 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003936
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003937 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003939 value = PyDict_GetItem(self->memo, py_str);
3940 if (! value) {
3941 PyErr_SetObject(BadPickleGet, py_str);
3942 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003943 }
3944 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003945 PDATA_APPEND(self->stack, value, -1);
3946 rc = 0;
3947 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003948
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003949 Py_DECREF(py_str);
3950 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003951}
3952
3953
3954static int
Tim Peterscba30e22003-02-01 06:24:36 +00003955load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003956{
3957 PyObject *py_key = 0, *value = 0;
3958 unsigned char key;
3959 char *s;
3960 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003961
Tim Peters0bc93f52003-02-02 18:29:33 +00003962 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003964 key = (unsigned char)s[0];
3965 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003967 value = PyDict_GetItem(self->memo, py_key);
3968 if (! value) {
3969 PyErr_SetObject(BadPickleGet, py_key);
3970 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003971 }
3972 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003973 PDATA_APPEND(self->stack, value, -1);
3974 rc = 0;
3975 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003976
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003977 Py_DECREF(py_key);
3978 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003979}
3980
3981
3982static int
Tim Peterscba30e22003-02-01 06:24:36 +00003983load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003984{
3985 PyObject *py_key = 0, *value = 0;
3986 unsigned char c;
3987 char *s;
3988 long key;
3989 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003990
Tim Peters0bc93f52003-02-02 18:29:33 +00003991 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003992
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003993 c = (unsigned char)s[0];
3994 key = (long)c;
3995 c = (unsigned char)s[1];
3996 key |= (long)c << 8;
3997 c = (unsigned char)s[2];
3998 key |= (long)c << 16;
3999 c = (unsigned char)s[3];
4000 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004001
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004002 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4003
4004 value = PyDict_GetItem(self->memo, py_key);
4005 if (! value) {
4006 PyErr_SetObject(BadPickleGet, py_key);
4007 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004008 }
4009 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004010 PDATA_APPEND(self->stack, value, -1);
4011 rc = 0;
4012 }
4013
4014 Py_DECREF(py_key);
4015 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004016}
4017
Tim Peters2d629652003-02-04 05:06:17 +00004018/* Push an object from the extension registry (EXT[124]). nbytes is
4019 * the number of bytes following the opcode, holding the index (code) value.
4020 */
4021static int
4022load_extension(Unpicklerobject *self, int nbytes)
4023{
4024 char *codebytes; /* the nbytes bytes after the opcode */
4025 long code; /* calc_binint returns long */
4026 PyObject *py_code; /* code as a Python int */
4027 PyObject *obj; /* the object to push */
4028 PyObject *pair; /* (module_name, class_name) */
4029 PyObject *module_name, *class_name;
4030
4031 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4032 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4033 code = calc_binint(codebytes, nbytes);
4034 if (code <= 0) { /* note that 0 is forbidden */
4035 /* Corrupt or hostile pickle. */
4036 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
4037 return -1;
4038 }
4039
4040 /* Look for the code in the cache. */
4041 py_code = PyInt_FromLong(code);
4042 if (py_code == NULL) return -1;
4043 obj = PyDict_GetItem(extension_cache, py_code);
4044 if (obj != NULL) {
4045 /* Bingo. */
4046 Py_DECREF(py_code);
4047 PDATA_APPEND(self->stack, obj, -1);
4048 return 0;
4049 }
4050
4051 /* Look up the (module_name, class_name) pair. */
4052 pair = PyDict_GetItem(inverted_registry, py_code);
4053 if (pair == NULL) {
4054 Py_DECREF(py_code);
4055 PyErr_Format(PyExc_ValueError, "unregistered extension "
4056 "code %ld", code);
4057 return -1;
4058 }
4059 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00004060 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00004061 */
4062 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
4063 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
4064 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
4065 Py_DECREF(py_code);
4066 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
4067 "isn't a 2-tuple of strings", code);
4068 return -1;
4069 }
4070 /* Load the object. */
4071 obj = find_class(module_name, class_name, self->find_class);
4072 if (obj == NULL) {
4073 Py_DECREF(py_code);
4074 return -1;
4075 }
4076 /* Cache code -> obj. */
4077 code = PyDict_SetItem(extension_cache, py_code, obj);
4078 Py_DECREF(py_code);
4079 if (code < 0) {
4080 Py_DECREF(obj);
4081 return -1;
4082 }
4083 PDATA_PUSH(self->stack, obj, -1);
4084 return 0;
4085}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004086
4087static int
Tim Peterscba30e22003-02-01 06:24:36 +00004088load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004089{
4090 PyObject *py_str = 0, *value = 0;
4091 int len, l;
4092 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004093
Tim Peters0bc93f52003-02-02 18:29:33 +00004094 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004095 if (l < 2) return bad_readline();
4096 if (!( len=self->stack->length )) return stackUnderflow();
4097 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
4098 value=self->stack->data[len-1];
4099 l=PyDict_SetItem(self->memo, py_str, value);
4100 Py_DECREF(py_str);
4101 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004102}
4103
4104
4105static int
Tim Peterscba30e22003-02-01 06:24:36 +00004106load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004107{
4108 PyObject *py_key = 0, *value = 0;
4109 unsigned char key;
4110 char *s;
4111 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004112
Tim Peters0bc93f52003-02-02 18:29:33 +00004113 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004114 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004116 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00004117
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004118 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4119 value=self->stack->data[len-1];
4120 len=PyDict_SetItem(self->memo, py_key, value);
4121 Py_DECREF(py_key);
4122 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004123}
4124
4125
4126static int
Tim Peterscba30e22003-02-01 06:24:36 +00004127load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004128{
4129 PyObject *py_key = 0, *value = 0;
4130 long key;
4131 unsigned char c;
4132 char *s;
4133 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004134
Tim Peters0bc93f52003-02-02 18:29:33 +00004135 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004136 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004138 c = (unsigned char)s[0];
4139 key = (long)c;
4140 c = (unsigned char)s[1];
4141 key |= (long)c << 8;
4142 c = (unsigned char)s[2];
4143 key |= (long)c << 16;
4144 c = (unsigned char)s[3];
4145 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00004146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004147 if (!( py_key = PyInt_FromLong(key))) return -1;
4148 value=self->stack->data[len-1];
4149 len=PyDict_SetItem(self->memo, py_key, value);
4150 Py_DECREF(py_key);
4151 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004152}
4153
4154
4155static int
Tim Peterscba30e22003-02-01 06:24:36 +00004156do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004157{
4158 PyObject *value = 0, *list = 0, *append_method = 0;
4159 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004160
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004161 len=self->stack->length;
4162 if (!( len >= x && x > 0 )) return stackUnderflow();
4163 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00004164 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004166 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004168 if (PyList_Check(list)) {
4169 PyObject *slice;
4170 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00004171
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004172 slice=Pdata_popList(self->stack, x);
Neal Norwitzb59d08c2006-07-22 16:20:49 +00004173 if (! slice) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004174 list_len = PyList_GET_SIZE(list);
4175 i=PyList_SetSlice(list, list_len, list_len, slice);
4176 Py_DECREF(slice);
4177 return i;
4178 }
4179 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004180
Tim Peterscba30e22003-02-01 06:24:36 +00004181 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004182 return -1;
4183
4184 for (i = x; i < len; i++) {
4185 PyObject *junk;
4186
4187 value=self->stack->data[i];
4188 junk=0;
4189 ARG_TUP(self, value);
4190 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004191 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004192 NULL);
4193 FREE_ARG_TUP(self);
4194 }
4195 if (! junk) {
4196 Pdata_clear(self->stack, i+1);
4197 self->stack->length=x;
4198 Py_DECREF(append_method);
4199 return -1;
4200 }
4201 Py_DECREF(junk);
4202 }
4203 self->stack->length=x;
4204 Py_DECREF(append_method);
4205 }
4206
4207 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004208}
4209
4210
4211static int
Tim Peterscba30e22003-02-01 06:24:36 +00004212load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004213{
4214 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004215}
4216
4217
4218static int
Tim Peterscba30e22003-02-01 06:24:36 +00004219load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004220{
4221 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004222}
4223
4224
4225static int
Tim Peterscba30e22003-02-01 06:24:36 +00004226do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004227{
4228 PyObject *value = 0, *key = 0, *dict = 0;
4229 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004230
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004231 if (!( (len=self->stack->length) >= x
4232 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004234 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004235
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004236 for (i = x+1; i < len; i += 2) {
4237 key =self->stack->data[i-1];
4238 value=self->stack->data[i ];
4239 if (PyObject_SetItem(dict, key, value) < 0) {
4240 r=-1;
4241 break;
4242 }
4243 }
4244
4245 Pdata_clear(self->stack, x);
4246
4247 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004248}
4249
4250
Tim Peters84e87f32001-03-17 04:50:51 +00004251static int
Tim Peterscba30e22003-02-01 06:24:36 +00004252load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004253{
4254 return do_setitems(self, self->stack->length - 2);
4255}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004256
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004257static int
Tim Peterscba30e22003-02-01 06:24:36 +00004258load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004259{
4260 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004261}
4262
Tim Peters84e87f32001-03-17 04:50:51 +00004263
Guido van Rossum60456fd1997-04-09 17:36:32 +00004264static int
Tim Peterscba30e22003-02-01 06:24:36 +00004265load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004266{
Tim Peters080c88b2003-02-15 03:01:11 +00004267 PyObject *state, *inst, *slotstate;
4268 PyObject *__setstate__;
4269 PyObject *d_key, *d_value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004270 Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00004271 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004272
Tim Peters080c88b2003-02-15 03:01:11 +00004273 /* Stack is ... instance, state. We want to leave instance at
4274 * the stack top, possibly mutated via instance.__setstate__(state).
4275 */
4276 if (self->stack->length < 2)
4277 return stackUnderflow();
4278 PDATA_POP(self->stack, state);
4279 if (state == NULL)
4280 return -1;
4281 inst = self->stack->data[self->stack->length - 1];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004282
Tim Peters080c88b2003-02-15 03:01:11 +00004283 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
4284 if (__setstate__ != NULL) {
4285 PyObject *junk = NULL;
4286
4287 /* The explicit __setstate__ is responsible for everything. */
4288 ARG_TUP(self, state);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004289 if (self->arg) {
4290 junk = PyObject_Call(__setstate__, self->arg, NULL);
4291 FREE_ARG_TUP(self);
4292 }
4293 Py_DECREF(__setstate__);
Tim Peters080c88b2003-02-15 03:01:11 +00004294 if (junk == NULL)
4295 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004296 Py_DECREF(junk);
4297 return 0;
4298 }
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00004299 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4300 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004301 PyErr_Clear();
Tim Peters080c88b2003-02-15 03:01:11 +00004302
4303 /* A default __setstate__. First see whether state embeds a
4304 * slot state dict too (a proto 2 addition).
4305 */
4306 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
4307 PyObject *temp = state;
4308 state = PyTuple_GET_ITEM(temp, 0);
4309 slotstate = PyTuple_GET_ITEM(temp, 1);
4310 Py_INCREF(state);
4311 Py_INCREF(slotstate);
4312 Py_DECREF(temp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004313 }
Tim Peters080c88b2003-02-15 03:01:11 +00004314 else
4315 slotstate = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004316
Tim Peters080c88b2003-02-15 03:01:11 +00004317 /* Set inst.__dict__ from the state dict (if any). */
4318 if (state != Py_None) {
4319 PyObject *dict;
4320 if (! PyDict_Check(state)) {
4321 PyErr_SetString(UnpicklingError, "state is not a "
4322 "dictionary");
4323 goto finally;
4324 }
4325 dict = PyObject_GetAttr(inst, __dict___str);
4326 if (dict == NULL)
4327 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004328
Tim Peters080c88b2003-02-15 03:01:11 +00004329 i = 0;
4330 while (PyDict_Next(state, &i, &d_key, &d_value)) {
4331 if (PyObject_SetItem(dict, d_key, d_value) < 0)
4332 goto finally;
4333 }
4334 Py_DECREF(dict);
4335 }
4336
4337 /* Also set instance attributes from the slotstate dict (if any). */
4338 if (slotstate != NULL) {
4339 if (! PyDict_Check(slotstate)) {
4340 PyErr_SetString(UnpicklingError, "slot state is not "
4341 "a dictionary");
4342 goto finally;
4343 }
4344 i = 0;
4345 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4346 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4347 goto finally;
4348 }
4349 }
4350 res = 0;
4351
4352 finally:
4353 Py_DECREF(state);
4354 Py_XDECREF(slotstate);
4355 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004356}
4357
4358
4359static int
Tim Peterscba30e22003-02-01 06:24:36 +00004360load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004361{
4362 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004363
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004364 /* Note that we split the (pickle.py) stack into two stacks, an
4365 object stack and a mark stack. Here we push a mark onto the
4366 mark stack.
4367 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004369 if ((self->num_marks + 1) >= self->marks_size) {
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004370 int *marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004371 s=self->marks_size+20;
4372 if (s <= self->num_marks) s=self->num_marks + 1;
4373 if (self->marks == NULL)
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004374 marks=(int *)malloc(s * sizeof(int));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004375 else
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004376 marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004377 s * sizeof(int));
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004378 if (!marks) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004379 PyErr_NoMemory();
4380 return -1;
4381 }
Kristján Valur Jónsson17b8e972007-04-25 00:10:50 +00004382 self->marks = marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004383 self->marks_size = s;
4384 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004386 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004387
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004388 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004389}
4390
Guido van Rossum60456fd1997-04-09 17:36:32 +00004391static int
Tim Peterscba30e22003-02-01 06:24:36 +00004392load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004393{
4394 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004396 PDATA_POP(self->stack, arg_tup);
4397 if (! arg_tup) return -1;
4398 PDATA_POP(self->stack, callable);
4399 if (callable) {
4400 ob = Instance_New(callable, arg_tup);
4401 Py_DECREF(callable);
4402 }
4403 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004404
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004405 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004406
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004407 PDATA_PUSH(self->stack, ob, -1);
4408 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004409}
Tim Peters84e87f32001-03-17 04:50:51 +00004410
Tim Peters4190fb82003-02-02 16:09:05 +00004411/* Just raises an error if we don't know the protocol specified. PROTO
4412 * is the first opcode for protocols >= 2.
4413 */
4414static int
4415load_proto(Unpicklerobject *self)
4416{
4417 int i;
4418 char *protobyte;
4419
4420 i = self->read_func(self, &protobyte, 1);
4421 if (i < 0)
4422 return -1;
4423
4424 i = calc_binint(protobyte, 1);
4425 /* No point checking for < 0, since calc_binint returns an unsigned
4426 * int when chewing on 1 byte.
4427 */
4428 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004429 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004430 return 0;
4431
4432 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4433 return -1;
4434}
4435
Guido van Rossum60456fd1997-04-09 17:36:32 +00004436static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004437load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004438{
4439 PyObject *err = 0, *val = 0;
4440 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004441
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004442 self->num_marks = 0;
4443 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004445 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004446 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004447 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004448
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004449 switch (s[0]) {
4450 case NONE:
4451 if (load_none(self) < 0)
4452 break;
4453 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004454
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004455 case BININT:
4456 if (load_binint(self) < 0)
4457 break;
4458 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004460 case BININT1:
4461 if (load_binint1(self) < 0)
4462 break;
4463 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004464
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004465 case BININT2:
4466 if (load_binint2(self) < 0)
4467 break;
4468 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004469
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004470 case INT:
4471 if (load_int(self) < 0)
4472 break;
4473 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004474
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004475 case LONG:
4476 if (load_long(self) < 0)
4477 break;
4478 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004479
Tim Petersee1a53c2003-02-02 02:57:53 +00004480 case LONG1:
4481 if (load_counted_long(self, 1) < 0)
4482 break;
4483 continue;
4484
4485 case LONG4:
4486 if (load_counted_long(self, 4) < 0)
4487 break;
4488 continue;
4489
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004490 case FLOAT:
4491 if (load_float(self) < 0)
4492 break;
4493 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004494
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004495 case BINFLOAT:
4496 if (load_binfloat(self) < 0)
4497 break;
4498 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004499
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004500 case BINSTRING:
4501 if (load_binstring(self) < 0)
4502 break;
4503 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004504
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004505 case SHORT_BINSTRING:
4506 if (load_short_binstring(self) < 0)
4507 break;
4508 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004510 case STRING:
4511 if (load_string(self) < 0)
4512 break;
4513 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004514
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004515#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004516 case UNICODE:
4517 if (load_unicode(self) < 0)
4518 break;
4519 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004521 case BINUNICODE:
4522 if (load_binunicode(self) < 0)
4523 break;
4524 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004525#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004527 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004528 if (load_counted_tuple(self, 0) < 0)
4529 break;
4530 continue;
4531
4532 case TUPLE1:
4533 if (load_counted_tuple(self, 1) < 0)
4534 break;
4535 continue;
4536
4537 case TUPLE2:
4538 if (load_counted_tuple(self, 2) < 0)
4539 break;
4540 continue;
4541
4542 case TUPLE3:
4543 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004544 break;
4545 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004546
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004547 case TUPLE:
4548 if (load_tuple(self) < 0)
4549 break;
4550 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004552 case EMPTY_LIST:
4553 if (load_empty_list(self) < 0)
4554 break;
4555 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004557 case LIST:
4558 if (load_list(self) < 0)
4559 break;
4560 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004562 case EMPTY_DICT:
4563 if (load_empty_dict(self) < 0)
4564 break;
4565 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004566
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004567 case DICT:
4568 if (load_dict(self) < 0)
4569 break;
4570 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004571
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004572 case OBJ:
4573 if (load_obj(self) < 0)
4574 break;
4575 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004577 case INST:
4578 if (load_inst(self) < 0)
4579 break;
4580 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004581
Tim Peterseab7db32003-02-13 18:24:14 +00004582 case NEWOBJ:
4583 if (load_newobj(self) < 0)
4584 break;
4585 continue;
4586
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004587 case GLOBAL:
4588 if (load_global(self) < 0)
4589 break;
4590 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004592 case APPEND:
4593 if (load_append(self) < 0)
4594 break;
4595 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004596
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004597 case APPENDS:
4598 if (load_appends(self) < 0)
4599 break;
4600 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004602 case BUILD:
4603 if (load_build(self) < 0)
4604 break;
4605 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004607 case DUP:
4608 if (load_dup(self) < 0)
4609 break;
4610 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004612 case BINGET:
4613 if (load_binget(self) < 0)
4614 break;
4615 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004617 case LONG_BINGET:
4618 if (load_long_binget(self) < 0)
4619 break;
4620 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004621
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004622 case GET:
4623 if (load_get(self) < 0)
4624 break;
4625 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004626
Tim Peters2d629652003-02-04 05:06:17 +00004627 case EXT1:
4628 if (load_extension(self, 1) < 0)
4629 break;
4630 continue;
4631
4632 case EXT2:
4633 if (load_extension(self, 2) < 0)
4634 break;
4635 continue;
4636
4637 case EXT4:
4638 if (load_extension(self, 4) < 0)
4639 break;
4640 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004641 case MARK:
4642 if (load_mark(self) < 0)
4643 break;
4644 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004645
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004646 case BINPUT:
4647 if (load_binput(self) < 0)
4648 break;
4649 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004651 case LONG_BINPUT:
4652 if (load_long_binput(self) < 0)
4653 break;
4654 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004655
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004656 case PUT:
4657 if (load_put(self) < 0)
4658 break;
4659 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004660
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004661 case POP:
4662 if (load_pop(self) < 0)
4663 break;
4664 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004665
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004666 case POP_MARK:
4667 if (load_pop_mark(self) < 0)
4668 break;
4669 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004671 case SETITEM:
4672 if (load_setitem(self) < 0)
4673 break;
4674 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004675
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004676 case SETITEMS:
4677 if (load_setitems(self) < 0)
4678 break;
4679 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004680
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004681 case STOP:
4682 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004683
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004684 case PERSID:
4685 if (load_persid(self) < 0)
4686 break;
4687 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004689 case BINPERSID:
4690 if (load_binpersid(self) < 0)
4691 break;
4692 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004694 case REDUCE:
4695 if (load_reduce(self) < 0)
4696 break;
4697 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004698
Tim Peters4190fb82003-02-02 16:09:05 +00004699 case PROTO:
4700 if (load_proto(self) < 0)
4701 break;
4702 continue;
4703
Tim Peters3c67d792003-02-02 17:59:11 +00004704 case NEWTRUE:
4705 if (load_bool(self, Py_True) < 0)
4706 break;
4707 continue;
4708
4709 case NEWFALSE:
4710 if (load_bool(self, Py_False) < 0)
4711 break;
4712 continue;
4713
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004714 case '\0':
4715 /* end of file */
4716 PyErr_SetNone(PyExc_EOFError);
4717 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004718
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004719 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004720 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004721 "invalid load key, '%s'.",
4722 "c", s[0]);
4723 return NULL;
4724 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004725
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004726 break;
4727 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004728
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004729 if ((err = PyErr_Occurred())) {
4730 if (err == PyExc_EOFError) {
4731 PyErr_SetNone(PyExc_EOFError);
4732 }
4733 return NULL;
4734 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004735
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004736 PDATA_POP(self->stack, val);
4737 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004738}
Tim Peters84e87f32001-03-17 04:50:51 +00004739
Guido van Rossum60456fd1997-04-09 17:36:32 +00004740
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004741/* No-load functions to support noload, which is used to
4742 find persistent references. */
4743
4744static int
Tim Peterscba30e22003-02-01 06:24:36 +00004745noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004746{
4747 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004749 if ((i = marker(self)) < 0) return -1;
4750 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004751}
4752
4753
4754static int
Tim Peterscba30e22003-02-01 06:24:36 +00004755noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004756{
4757 int i;
4758 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004760 if ((i = marker(self)) < 0) return -1;
4761 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004762 if (self->readline_func(self, &s) < 0) return -1;
4763 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00004764 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004765 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004766}
4767
4768static int
Tim Peterseab7db32003-02-13 18:24:14 +00004769noload_newobj(Unpicklerobject *self)
4770{
4771 PyObject *obj;
4772
4773 PDATA_POP(self->stack, obj); /* pop argtuple */
4774 if (obj == NULL) return -1;
4775 Py_DECREF(obj);
4776
4777 PDATA_POP(self->stack, obj); /* pop cls */
4778 if (obj == NULL) return -1;
4779 Py_DECREF(obj);
4780
4781 PDATA_APPEND(self->stack, Py_None, -1);
4782 return 0;
4783}
4784
4785static int
Tim Peterscba30e22003-02-01 06:24:36 +00004786noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004787{
4788 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004789
Tim Peters0bc93f52003-02-02 18:29:33 +00004790 if (self->readline_func(self, &s) < 0) return -1;
4791 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004792 PDATA_APPEND(self->stack, Py_None,-1);
4793 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004794}
4795
4796static int
Tim Peterscba30e22003-02-01 06:24:36 +00004797noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004798{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004799
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004800 if (self->stack->length < 2) return stackUnderflow();
4801 Pdata_clear(self->stack, self->stack->length-2);
4802 PDATA_APPEND(self->stack, Py_None,-1);
4803 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004804}
4805
4806static int
4807noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004808
Guido van Rossum053b8df1998-11-25 16:18:00 +00004809 if (self->stack->length < 1) return stackUnderflow();
4810 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004811 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004812}
4813
Tim Peters2d629652003-02-04 05:06:17 +00004814static int
4815noload_extension(Unpicklerobject *self, int nbytes)
4816{
4817 char *codebytes;
4818
4819 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4820 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4821 PDATA_APPEND(self->stack, Py_None, -1);
4822 return 0;
4823}
4824
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004825
4826static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004827noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004828{
4829 PyObject *err = 0, *val = 0;
4830 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004831
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004832 self->num_marks = 0;
4833 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004835 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004836 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004837 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004838
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004839 switch (s[0]) {
4840 case NONE:
4841 if (load_none(self) < 0)
4842 break;
4843 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004844
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004845 case BININT:
4846 if (load_binint(self) < 0)
4847 break;
4848 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004850 case BININT1:
4851 if (load_binint1(self) < 0)
4852 break;
4853 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004854
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004855 case BININT2:
4856 if (load_binint2(self) < 0)
4857 break;
4858 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004860 case INT:
4861 if (load_int(self) < 0)
4862 break;
4863 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004865 case LONG:
4866 if (load_long(self) < 0)
4867 break;
4868 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004869
Tim Peters4190fb82003-02-02 16:09:05 +00004870 case LONG1:
4871 if (load_counted_long(self, 1) < 0)
4872 break;
4873 continue;
4874
4875 case LONG4:
4876 if (load_counted_long(self, 4) < 0)
4877 break;
4878 continue;
4879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004880 case FLOAT:
4881 if (load_float(self) < 0)
4882 break;
4883 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004884
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004885 case BINFLOAT:
4886 if (load_binfloat(self) < 0)
4887 break;
4888 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004890 case BINSTRING:
4891 if (load_binstring(self) < 0)
4892 break;
4893 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004895 case SHORT_BINSTRING:
4896 if (load_short_binstring(self) < 0)
4897 break;
4898 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004899
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004900 case STRING:
4901 if (load_string(self) < 0)
4902 break;
4903 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004904
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004905#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004906 case UNICODE:
4907 if (load_unicode(self) < 0)
4908 break;
4909 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004910
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004911 case BINUNICODE:
4912 if (load_binunicode(self) < 0)
4913 break;
4914 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004915#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004916
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004917 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004918 if (load_counted_tuple(self, 0) < 0)
4919 break;
4920 continue;
4921
4922 case TUPLE1:
4923 if (load_counted_tuple(self, 1) < 0)
4924 break;
4925 continue;
4926
4927 case TUPLE2:
4928 if (load_counted_tuple(self, 2) < 0)
4929 break;
4930 continue;
4931
4932 case TUPLE3:
4933 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004934 break;
4935 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004936
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004937 case TUPLE:
4938 if (load_tuple(self) < 0)
4939 break;
4940 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004942 case EMPTY_LIST:
4943 if (load_empty_list(self) < 0)
4944 break;
4945 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004947 case LIST:
4948 if (load_list(self) < 0)
4949 break;
4950 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004951
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004952 case EMPTY_DICT:
4953 if (load_empty_dict(self) < 0)
4954 break;
4955 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004957 case DICT:
4958 if (load_dict(self) < 0)
4959 break;
4960 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004961
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004962 case OBJ:
4963 if (noload_obj(self) < 0)
4964 break;
4965 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004967 case INST:
4968 if (noload_inst(self) < 0)
4969 break;
4970 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004971
Tim Peterseab7db32003-02-13 18:24:14 +00004972 case NEWOBJ:
4973 if (noload_newobj(self) < 0)
4974 break;
4975 continue;
4976
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004977 case GLOBAL:
4978 if (noload_global(self) < 0)
4979 break;
4980 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004981
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004982 case APPEND:
4983 if (load_append(self) < 0)
4984 break;
4985 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004986
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004987 case APPENDS:
4988 if (load_appends(self) < 0)
4989 break;
4990 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004991
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004992 case BUILD:
4993 if (noload_build(self) < 0)
4994 break;
4995 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004996
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004997 case DUP:
4998 if (load_dup(self) < 0)
4999 break;
5000 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005001
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005002 case BINGET:
5003 if (load_binget(self) < 0)
5004 break;
5005 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005006
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005007 case LONG_BINGET:
5008 if (load_long_binget(self) < 0)
5009 break;
5010 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005011
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005012 case GET:
5013 if (load_get(self) < 0)
5014 break;
5015 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005016
Tim Peters2d629652003-02-04 05:06:17 +00005017 case EXT1:
5018 if (noload_extension(self, 1) < 0)
5019 break;
5020 continue;
5021
5022 case EXT2:
5023 if (noload_extension(self, 2) < 0)
5024 break;
5025 continue;
5026
5027 case EXT4:
5028 if (noload_extension(self, 4) < 0)
5029 break;
5030 continue;
5031
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005032 case MARK:
5033 if (load_mark(self) < 0)
5034 break;
5035 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005036
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005037 case BINPUT:
5038 if (load_binput(self) < 0)
5039 break;
5040 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005042 case LONG_BINPUT:
5043 if (load_long_binput(self) < 0)
5044 break;
5045 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005046
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005047 case PUT:
5048 if (load_put(self) < 0)
5049 break;
5050 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005051
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005052 case POP:
5053 if (load_pop(self) < 0)
5054 break;
5055 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005056
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005057 case POP_MARK:
5058 if (load_pop_mark(self) < 0)
5059 break;
5060 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005061
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005062 case SETITEM:
5063 if (load_setitem(self) < 0)
5064 break;
5065 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005066
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005067 case SETITEMS:
5068 if (load_setitems(self) < 0)
5069 break;
5070 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005072 case STOP:
5073 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005075 case PERSID:
5076 if (load_persid(self) < 0)
5077 break;
5078 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005079
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005080 case BINPERSID:
5081 if (load_binpersid(self) < 0)
5082 break;
5083 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005085 case REDUCE:
5086 if (noload_reduce(self) < 0)
5087 break;
5088 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005089
Tim Peters4190fb82003-02-02 16:09:05 +00005090 case PROTO:
5091 if (load_proto(self) < 0)
5092 break;
5093 continue;
5094
Tim Peters3c67d792003-02-02 17:59:11 +00005095 case NEWTRUE:
5096 if (load_bool(self, Py_True) < 0)
5097 break;
5098 continue;
5099
5100 case NEWFALSE:
5101 if (load_bool(self, Py_False) < 0)
5102 break;
5103 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005104 default:
Tim Peterscba30e22003-02-01 06:24:36 +00005105 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005106 "invalid load key, '%s'.",
5107 "c", s[0]);
5108 return NULL;
5109 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005110
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005111 break;
5112 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005114 if ((err = PyErr_Occurred())) {
5115 if (err == PyExc_EOFError) {
5116 PyErr_SetNone(PyExc_EOFError);
5117 }
5118 return NULL;
5119 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005120
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005121 PDATA_POP(self->stack, val);
5122 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005123}
Tim Peters84e87f32001-03-17 04:50:51 +00005124
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005125
Guido van Rossum60456fd1997-04-09 17:36:32 +00005126static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005127Unpickler_load(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005128{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005129 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005130}
5131
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005132static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005133Unpickler_noload(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005134{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005135 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005136}
5137
Guido van Rossum60456fd1997-04-09 17:36:32 +00005138
5139static struct PyMethodDef Unpickler_methods[] = {
Georg Brandl96a8c392006-05-29 21:04:52 +00005140 {"load", (PyCFunction)Unpickler_load, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005141 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005142 },
Georg Brandl96a8c392006-05-29 21:04:52 +00005143 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005144 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005145 "noload() -- not load a pickle, but go through most of the motions\n"
5146 "\n"
5147 "This function can be used to read past a pickle without instantiating\n"
5148 "any objects or importing any modules. It can also be used to find all\n"
5149 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00005150 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005151 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00005152 {NULL, NULL} /* sentinel */
5153};
5154
5155
5156static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00005157newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005158{
5159 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005160
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005161 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005162 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005164 self->file = NULL;
5165 self->arg = NULL;
5166 self->stack = (Pdata*)Pdata_New();
5167 self->pers_func = NULL;
5168 self->last_string = NULL;
5169 self->marks = NULL;
5170 self->num_marks = 0;
5171 self->marks_size = 0;
5172 self->buf_size = 0;
5173 self->read = NULL;
5174 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005175 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005176
Tim Peterscba30e22003-02-01 06:24:36 +00005177 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005178 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005179
Neal Norwitzb59d08c2006-07-22 16:20:49 +00005180 if (!self->stack)
5181 goto err;
5182
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005183 Py_INCREF(f);
5184 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005185
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005186 /* Set read, readline based on type of f */
5187 if (PyFile_Check(f)) {
5188 self->fp = PyFile_AsFile(f);
5189 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00005190 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005191 "I/O operation on closed file");
5192 goto err;
5193 }
5194 self->read_func = read_file;
5195 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00005196 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005197 else if (PycStringIO_InputCheck(f)) {
5198 self->fp = NULL;
5199 self->read_func = read_cStringIO;
5200 self->readline_func = readline_cStringIO;
5201 }
5202 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00005203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005204 self->fp = NULL;
5205 self->read_func = read_other;
5206 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005208 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
5209 (self->read = PyObject_GetAttr(f, read_str)))) {
5210 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00005211 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005212 "argument must have 'read' and "
5213 "'readline' attributes" );
5214 goto err;
5215 }
5216 }
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005217 PyObject_GC_Track(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005218
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005219 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005220
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005221 err:
5222 Py_DECREF((PyObject *)self);
5223 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005224}
5225
5226
5227static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005228get_Unpickler(PyObject *self, PyObject *file)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005229{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005230 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005231}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005232
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005233
Guido van Rossum60456fd1997-04-09 17:36:32 +00005234static void
Tim Peterscba30e22003-02-01 06:24:36 +00005235Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005236{
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005237 PyObject_GC_UnTrack((PyObject *)self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005238 Py_XDECREF(self->readline);
5239 Py_XDECREF(self->read);
5240 Py_XDECREF(self->file);
5241 Py_XDECREF(self->memo);
5242 Py_XDECREF(self->stack);
5243 Py_XDECREF(self->pers_func);
5244 Py_XDECREF(self->arg);
5245 Py_XDECREF(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00005246 Py_XDECREF(self->find_class);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005247
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005248 if (self->marks) {
5249 free(self->marks);
5250 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005251
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005252 if (self->buf_size) {
5253 free(self->buf);
5254 }
Tim Peters84e87f32001-03-17 04:50:51 +00005255
Christian Heimese93237d2007-12-19 02:37:44 +00005256 Py_TYPE(self)->tp_free((PyObject *)self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005257}
5258
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005259static int
5260Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
5261{
Thomas Woutersc6e55062006-04-15 21:47:09 +00005262 Py_VISIT(self->readline);
5263 Py_VISIT(self->read);
5264 Py_VISIT(self->file);
5265 Py_VISIT(self->memo);
5266 Py_VISIT(self->stack);
5267 Py_VISIT(self->pers_func);
5268 Py_VISIT(self->arg);
5269 Py_VISIT(self->last_string);
5270 Py_VISIT(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005271 return 0;
5272}
5273
5274static int
5275Unpickler_clear(Unpicklerobject *self)
5276{
Thomas Woutersedf17d82006-04-15 17:28:34 +00005277 Py_CLEAR(self->readline);
5278 Py_CLEAR(self->read);
5279 Py_CLEAR(self->file);
5280 Py_CLEAR(self->memo);
5281 Py_CLEAR(self->stack);
5282 Py_CLEAR(self->pers_func);
5283 Py_CLEAR(self->arg);
5284 Py_CLEAR(self->last_string);
5285 Py_CLEAR(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005286 return 0;
5287}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005288
5289static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005290Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005291{
5292 if (!strcmp(name, "persistent_load")) {
5293 if (!self->pers_func) {
5294 PyErr_SetString(PyExc_AttributeError, name);
5295 return NULL;
5296 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005297
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005298 Py_INCREF(self->pers_func);
5299 return self->pers_func;
5300 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005302 if (!strcmp(name, "find_global")) {
5303 if (!self->find_class) {
5304 PyErr_SetString(PyExc_AttributeError, name);
5305 return NULL;
5306 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005307
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005308 Py_INCREF(self->find_class);
5309 return self->find_class;
5310 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005311
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005312 if (!strcmp(name, "memo")) {
5313 if (!self->memo) {
5314 PyErr_SetString(PyExc_AttributeError, name);
5315 return NULL;
5316 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005317
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005318 Py_INCREF(self->memo);
5319 return self->memo;
5320 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005322 if (!strcmp(name, "UnpicklingError")) {
5323 Py_INCREF(UnpicklingError);
5324 return UnpicklingError;
5325 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005326
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005327 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005328}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005329
Guido van Rossum60456fd1997-04-09 17:36:32 +00005330
5331static int
Tim Peterscba30e22003-02-01 06:24:36 +00005332Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005333{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005334
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005335 if (!strcmp(name, "persistent_load")) {
5336 Py_XDECREF(self->pers_func);
5337 self->pers_func = value;
5338 Py_XINCREF(value);
5339 return 0;
5340 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005342 if (!strcmp(name, "find_global")) {
5343 Py_XDECREF(self->find_class);
5344 self->find_class = value;
5345 Py_XINCREF(value);
5346 return 0;
5347 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005349 if (! value) {
5350 PyErr_SetString(PyExc_TypeError,
5351 "attribute deletion is not supported");
5352 return -1;
5353 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005355 if (strcmp(name, "memo") == 0) {
5356 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005357 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005358 "memo must be a dictionary");
5359 return -1;
5360 }
5361 Py_XDECREF(self->memo);
5362 self->memo = value;
5363 Py_INCREF(value);
5364 return 0;
5365 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005366
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005367 PyErr_SetString(PyExc_AttributeError, name);
5368 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005369}
5370
Tim Peters5bd2a792003-02-01 16:45:06 +00005371/* ---------------------------------------------------------------------------
5372 * Module-level functions.
5373 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005374
Martin v. Löwis544f1192004-07-27 05:22:33 +00005375/* dump(obj, file, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005376static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005377cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005378{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005379 static char *kwlist[] = {"obj", "file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005380 PyObject *ob, *file, *res = NULL;
5381 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005382 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005383
Martin v. Löwis544f1192004-07-27 05:22:33 +00005384 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5385 &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005386 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005387
Tim Peters5bd2a792003-02-01 16:45:06 +00005388 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005389 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005391 if (dump(pickler, ob) < 0)
5392 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005393
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005394 Py_INCREF(Py_None);
5395 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005396
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005397 finally:
5398 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005399
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005400 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005401}
5402
5403
Martin v. Löwis544f1192004-07-27 05:22:33 +00005404/* dumps(obj, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005405static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005406cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005407{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005408 static char *kwlist[] = {"obj", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005409 PyObject *ob, *file = 0, *res = NULL;
5410 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005411 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005412
Martin v. Löwis544f1192004-07-27 05:22:33 +00005413 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5414 &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005415 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005416
Tim Peterscba30e22003-02-01 06:24:36 +00005417 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005418 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005419
Tim Peters5bd2a792003-02-01 16:45:06 +00005420 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005421 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005423 if (dump(pickler, ob) < 0)
5424 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005425
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005426 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005427
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005428 finally:
5429 Py_XDECREF(pickler);
5430 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005431
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005432 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005433}
5434
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005435
Tim Peters5bd2a792003-02-01 16:45:06 +00005436/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005437static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005438cpm_load(PyObject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005439{
5440 Unpicklerobject *unpickler = 0;
Georg Brandl96a8c392006-05-29 21:04:52 +00005441 PyObject *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005442
Tim Peterscba30e22003-02-01 06:24:36 +00005443 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005444 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005445
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005446 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005448 finally:
5449 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005450
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005451 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005452}
5453
5454
Tim Peters5bd2a792003-02-01 16:45:06 +00005455/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005456static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005457cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005458{
5459 PyObject *ob, *file = 0, *res = NULL;
5460 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005461
Tim Peterscba30e22003-02-01 06:24:36 +00005462 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005463 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005464
Tim Peterscba30e22003-02-01 06:24:36 +00005465 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005466 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005467
Tim Peterscba30e22003-02-01 06:24:36 +00005468 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005469 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005470
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005471 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005473 finally:
5474 Py_XDECREF(file);
5475 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005476
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005477 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005478}
5479
5480
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005481PyDoc_STRVAR(Unpicklertype__doc__,
5482"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005483
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005484static PyTypeObject Unpicklertype = {
Martin v. Löwis68192102007-07-21 06:55:02 +00005485 PyVarObject_HEAD_INIT(NULL, 0)
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005486 "cPickle.Unpickler", /*tp_name*/
5487 sizeof(Unpicklerobject), /*tp_basicsize*/
5488 0,
5489 (destructor)Unpickler_dealloc, /* tp_dealloc */
5490 0, /* tp_print */
5491 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5492 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5493 0, /* tp_compare */
5494 0, /* tp_repr */
5495 0, /* tp_as_number */
5496 0, /* tp_as_sequence */
5497 0, /* tp_as_mapping */
5498 0, /* tp_hash */
5499 0, /* tp_call */
5500 0, /* tp_str */
5501 0, /* tp_getattro */
5502 0, /* tp_setattro */
5503 0, /* tp_as_buffer */
5504 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5505 Unpicklertype__doc__, /* tp_doc */
5506 (traverseproc)Unpickler_traverse, /* tp_traverse */
5507 (inquiry)Unpickler_clear, /* tp_clear */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005508};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005509
Guido van Rossum60456fd1997-04-09 17:36:32 +00005510static struct PyMethodDef cPickle_methods[] = {
Martin v. Löwis544f1192004-07-27 05:22:33 +00005511 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5512 PyDoc_STR("dump(obj, file, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005513 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005514 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005515 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005516 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005517
Martin v. Löwis544f1192004-07-27 05:22:33 +00005518 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5519 PyDoc_STR("dumps(obj, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005520 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005521 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005522 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005523 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005524
Georg Brandl96a8c392006-05-29 21:04:52 +00005525 {"load", (PyCFunction)cpm_load, METH_O,
Neal Norwitz200788c2002-08-13 22:20:41 +00005526 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005527
Neal Norwitzb0493252002-03-31 14:44:22 +00005528 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005529 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005530
Martin v. Löwis544f1192004-07-27 05:22:33 +00005531 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5532 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005533 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005534 "This takes a file-like object for writing a pickle data stream.\n"
5535 "The optional proto argument tells the pickler to use the given\n"
5536 "protocol; supported protocols are 0, 1, 2. The default\n"
5537 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5538 "only protocol that can be written to a file opened in text\n"
5539 "mode and read back successfully. When using a protocol higher\n"
5540 "than 0, make sure the file is opened in binary mode, both when\n"
5541 "pickling and unpickling.)\n"
5542 "\n"
5543 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5544 "more efficient than protocol 1.\n"
5545 "\n"
5546 "Specifying a negative protocol version selects the highest\n"
5547 "protocol version supported. The higher the protocol used, the\n"
5548 "more recent the version of Python needed to read the pickle\n"
5549 "produced.\n"
5550 "\n"
5551 "The file parameter must have a write() method that accepts a single\n"
5552 "string argument. It can thus be an open file object, a StringIO\n"
5553 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005554 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005555
Georg Brandl96a8c392006-05-29 21:04:52 +00005556 {"Unpickler", (PyCFunction)get_Unpickler, METH_O,
Tim Peters5bd2a792003-02-01 16:45:06 +00005557 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5558
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005559 { NULL, NULL }
5560};
5561
Guido van Rossum60456fd1997-04-09 17:36:32 +00005562static int
Tim Peterscba30e22003-02-01 06:24:36 +00005563init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005564{
5565 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005566
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00005567#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005568
Tim Peters3cfe7542003-05-21 21:29:48 +00005569 if (PyType_Ready(&Unpicklertype) < 0)
5570 return -1;
5571 if (PyType_Ready(&Picklertype) < 0)
5572 return -1;
5573
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005574 INIT_STR(__class__);
5575 INIT_STR(__getinitargs__);
5576 INIT_STR(__dict__);
5577 INIT_STR(__getstate__);
5578 INIT_STR(__setstate__);
5579 INIT_STR(__name__);
5580 INIT_STR(__main__);
5581 INIT_STR(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00005582 INIT_STR(__reduce_ex__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005583 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005584 INIT_STR(append);
5585 INIT_STR(read);
5586 INIT_STR(readline);
5587 INIT_STR(copy_reg);
5588 INIT_STR(dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005589
Tim Peterscba30e22003-02-01 06:24:36 +00005590 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005591 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005592
Tim Peters1f1b2d22003-02-01 02:16:37 +00005593 /* This is special because we want to use a different
5594 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005595 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005596 if (!dispatch_table) return -1;
5597
5598 extension_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005599 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005600 if (!extension_registry) return -1;
5601
5602 inverted_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005603 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005604 if (!inverted_registry) return -1;
5605
5606 extension_cache = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005607 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005608 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005610 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005611
Tim Peters731098b2003-02-04 20:56:09 +00005612 if (!(empty_tuple = PyTuple_New(0)))
5613 return -1;
5614
5615 two_tuple = PyTuple_New(2);
5616 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005617 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005618 /* We use this temp container with no regard to refcounts, or to
5619 * keeping containees alive. Exempt from GC, because we don't
5620 * want anything looking at two_tuple() by magic.
5621 */
5622 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005623
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005624 /* Ugh */
5625 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5626 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5627 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005628
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005629 if (!( t=PyDict_New())) return -1;
5630 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005631 "def __str__(self):\n"
5632 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5633 Py_file_input,
5634 module_dict, t) )) return -1;
5635 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005637 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005638 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005639 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005640
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005641 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005642
Tim Peterscba30e22003-02-01 06:24:36 +00005643 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005644 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005645 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005646 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005648 if (!( t=PyDict_New())) return -1;
5649 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005650 "def __str__(self):\n"
5651 " a=self.args\n"
5652 " a=a and type(a[0]) or '(what)'\n"
5653 " return 'Cannot pickle %s objects' % a\n"
5654 , Py_file_input,
5655 module_dict, t) )) return -1;
5656 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005657
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005658 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005659 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005660 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005662 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005663
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005664 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005665 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005666 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005667
Martin v. Löwis658009a2002-09-16 17:26:24 +00005668 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5669 UnpicklingError, NULL)))
5670 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005672 if (PyDict_SetItemString(module_dict, "PickleError",
5673 PickleError) < 0)
5674 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005675
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005676 if (PyDict_SetItemString(module_dict, "PicklingError",
5677 PicklingError) < 0)
5678 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005680 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5681 UnpicklingError) < 0)
5682 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005683
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005684 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5685 UnpickleableError) < 0)
5686 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005687
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005688 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5689 BadPickleGet) < 0)
5690 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005691
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005692 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005694 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005695}
5696
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005697#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5698#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005699#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005700PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005701initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005702{
5703 PyObject *m, *d, *di, *v, *k;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005704 Py_ssize_t i;
Tim Peters5b7da392003-02-04 00:21:07 +00005705 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005706 PyObject *format_version;
5707 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005708
Christian Heimese93237d2007-12-19 02:37:44 +00005709 Py_TYPE(&Picklertype) = &PyType_Type;
5710 Py_TYPE(&Unpicklertype) = &PyType_Type;
5711 Py_TYPE(&PdataType) = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005713 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005714 * so we're forced to use a temporary dictionary. :(
5715 */
5716 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005717 if (!di) return;
5718 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005719
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005720 /* Create the module and add the functions */
5721 m = Py_InitModule4("cPickle", cPickle_methods,
5722 cPickle_module_documentation,
5723 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00005724 if (m == NULL)
5725 return;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005727 /* Add some symbolic constants to the module */
5728 d = PyModule_GetDict(m);
Tim Peters5b7da392003-02-04 00:21:07 +00005729 v = PyString_FromString(rev);
5730 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005731 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005732
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005733 /* Copy data from di. Waaa. */
5734 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5735 if (PyObject_SetItem(d, k, v) < 0) {
5736 Py_DECREF(di);
5737 return;
5738 }
5739 }
5740 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005741
Tim Peters8587b3c2003-02-13 15:44:41 +00005742 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
5743 if (i < 0)
5744 return;
5745
Tim Peters5b7da392003-02-04 00:21:07 +00005746 /* These are purely informational; no code uses them. */
5747 /* File format version we write. */
5748 format_version = PyString_FromString("2.0");
5749 /* Format versions we can read. */
5750 compatible_formats = Py_BuildValue("[sssss]",
5751 "1.0", /* Original protocol 0 */
5752 "1.1", /* Protocol 0 + INST */
5753 "1.2", /* Original protocol 1 */
5754 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005755 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005756 PyDict_SetItemString(d, "format_version", format_version);
5757 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5758 Py_XDECREF(format_version);
5759 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005760}