blob: 4842078de08c966f5821b02033a34a5bb3fa5aac [file] [log] [blame]
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001#include "Python.h"
2#include "cStringIO.h"
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003#include "structmember.h"
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005PyDoc_STRVAR(cPickle_module_documentation,
Tim Peters64c04d12003-02-01 06:27:59 +00006"C implementation and optimization of the Python pickle module.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00007
Guido van Rossum142eeb81997-08-13 03:14:41 +00008#ifndef Py_eval_input
9#include <graminit.h>
10#define Py_eval_input eval_input
Guido van Rossumc6ef2041997-08-21 02:30:45 +000011#endif /* Py_eval_input */
Guido van Rossum142eeb81997-08-13 03:14:41 +000012
Guido van Rossum60456fd1997-04-09 17:36:32 +000013#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000014
Guido van Rossum60456fd1997-04-09 17:36:32 +000015#define WRITE_BUF_SIZE 256
16
Tim Peters5bd2a792003-02-01 16:45:06 +000017/* Bump this when new opcodes are added to the pickle protocol. */
Tim Peters8587b3c2003-02-13 15:44:41 +000018#define HIGHEST_PROTOCOL 2
Tim Peters5bd2a792003-02-01 16:45:06 +000019
Tim Peters797ec242003-02-01 06:22:36 +000020/*
21 * Pickle opcodes. These must be kept in synch with pickle.py. Extensive
22 * docs are in pickletools.py.
23 */
Guido van Rossum60456fd1997-04-09 17:36:32 +000024#define MARK '('
25#define STOP '.'
26#define POP '0'
27#define POP_MARK '1'
28#define DUP '2'
29#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000030#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000031#define INT 'I'
32#define BININT 'J'
33#define BININT1 'K'
34#define LONG 'L'
35#define BININT2 'M'
36#define NONE 'N'
37#define PERSID 'P'
38#define BINPERSID 'Q'
39#define REDUCE 'R'
40#define STRING 'S'
41#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +000042#define SHORT_BINSTRING 'U'
Guido van Rossum5fccb7c2000-03-10 23:11:40 +000043#define UNICODE 'V'
44#define BINUNICODE 'X'
Guido van Rossum60456fd1997-04-09 17:36:32 +000045#define APPEND 'a'
46#define BUILD 'b'
47#define GLOBAL 'c'
48#define DICT 'd'
49#define EMPTY_DICT '}'
50#define APPENDS 'e'
51#define GET 'g'
52#define BINGET 'h'
53#define INST 'i'
54#define LONG_BINGET 'j'
55#define LIST 'l'
56#define EMPTY_LIST ']'
57#define OBJ 'o'
58#define PUT 'p'
59#define BINPUT 'q'
60#define LONG_BINPUT 'r'
61#define SETITEM 's'
62#define TUPLE 't'
63#define EMPTY_TUPLE ')'
64#define SETITEMS 'u'
Tim Peters797ec242003-02-01 06:22:36 +000065
66/* Protocol 2. */
67#define PROTO '\x80' /* identify pickle protocol */
68#define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */
69#define EXT1 '\x82' /* push object from extension registry; 1-byte index */
70#define EXT2 '\x83' /* ditto, but 2-byte index */
71#define EXT4 '\x84' /* ditto, but 4-byte index */
72#define TUPLE1 '\x85' /* build 1-tuple from stack top */
73#define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */
74#define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */
75#define NEWTRUE '\x88' /* push True */
76#define NEWFALSE '\x89' /* push False */
77#define LONG1 '\x8a' /* push long from < 256 bytes */
78#define LONG4 '\x8b' /* push really big long */
79
80/* There aren't opcodes -- they're ways to pickle bools before protocol 2,
81 * so that unpicklers written before bools were introduced unpickle them
82 * as ints, but unpicklers after can recognize that bools were intended.
83 * Note that protocol 2 added direct ways to pickle bools.
84 */
Jack Jansen3a967022002-06-26 20:40:42 +000085#undef TRUE
Guido van Rossume2763392002-04-05 19:30:08 +000086#define TRUE "I01\n"
Jack Jansen3a967022002-06-26 20:40:42 +000087#undef FALSE
Guido van Rossume2763392002-04-05 19:30:08 +000088#define FALSE "I00\n"
Guido van Rossum77f6a652002-04-03 22:41:51 +000089
Tim Peters1092d642003-02-11 21:06:20 +000090/* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements
Tim Peters42f08ac2003-02-11 22:43:24 +000091 * batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will
92 * break if this gets out of synch with pickle.py, but it's unclear that
93 * would help anything either.
Tim Peters1092d642003-02-11 21:06:20 +000094 */
95#define BATCHSIZE 1000
96
Guido van Rossum60456fd1997-04-09 17:36:32 +000097static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000098
Guido van Rossumc03158b1999-06-09 15:23:31 +000099static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000100static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +0000101static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000102static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000103static PyObject *BadPickleGet;
104
Tim Peters5b7da392003-02-04 00:21:07 +0000105/* As the name says, an empty tuple. */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000106static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000107
Tim Peters5b7da392003-02-04 00:21:07 +0000108/* copy_reg.dispatch_table, {type_object: pickling_function} */
109static PyObject *dispatch_table;
110
111/* For EXT[124] opcodes. */
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000112/* copy_reg._extension_registry, {(module_name, function_name): code} */
Tim Peters5b7da392003-02-04 00:21:07 +0000113static PyObject *extension_registry;
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000114/* copy_reg._inverted_registry, {code: (module_name, function_name)} */
Tim Peters5b7da392003-02-04 00:21:07 +0000115static PyObject *inverted_registry;
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000116/* copy_reg._extension_cache, {code: object} */
Tim Peters5b7da392003-02-04 00:21:07 +0000117static PyObject *extension_cache;
118
Tim Peters731098b2003-02-04 20:56:09 +0000119/* For looking up name pairs in copy_reg._extension_registry. */
120static PyObject *two_tuple;
121
Guido van Rossum60456fd1997-04-09 17:36:32 +0000122static PyObject *__class___str, *__getinitargs___str, *__dict___str,
123 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
Guido van Rossumb289b872003-02-19 01:45:13 +0000124 *__reduce_ex___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000125 *write_str, *append_str,
Neal Norwitzb183a252006-04-10 01:03:32 +0000126 *read_str, *readline_str, *__main___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000127 *copy_reg_str, *dispatch_table_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000128
Guido van Rossum053b8df1998-11-25 16:18:00 +0000129/*************************************************************************
130 Internal Data type for pickle data. */
131
132typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000133 PyObject_HEAD
Tim Peters1d63c9f2003-02-02 20:29:39 +0000134 int length; /* number of initial slots in data currently used */
135 int size; /* number of slots in data allocated */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000136 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000137} Pdata;
138
Tim Peters84e87f32001-03-17 04:50:51 +0000139static void
Tim Peterscba30e22003-02-01 06:24:36 +0000140Pdata_dealloc(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000141{
142 int i;
143 PyObject **p;
Tim Peterscba30e22003-02-01 06:24:36 +0000144
Tim Peters1d63c9f2003-02-02 20:29:39 +0000145 for (i = self->length, p = self->data; --i >= 0; p++) {
146 Py_DECREF(*p);
147 }
148 if (self->data)
149 free(self->data);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000150 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000151}
152
153static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000154 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
155 (destructor)Pdata_dealloc,
156 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000157};
158
159#define Pdata_Check(O) ((O)->ob_type == &PdataType)
160
161static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000162Pdata_New(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000163{
164 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000165
Tim Peters1d63c9f2003-02-02 20:29:39 +0000166 if (!(self = PyObject_New(Pdata, &PdataType)))
167 return NULL;
168 self->size = 8;
169 self->length = 0;
170 self->data = malloc(self->size * sizeof(PyObject*));
171 if (self->data)
172 return (PyObject*)self;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000173 Py_DECREF(self);
174 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000175}
176
Tim Peters84e87f32001-03-17 04:50:51 +0000177static int
Tim Peterscba30e22003-02-01 06:24:36 +0000178stackUnderflow(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000179{
180 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
181 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000182}
183
Tim Peters1d63c9f2003-02-02 20:29:39 +0000184/* Retain only the initial clearto items. If clearto >= the current
185 * number of items, this is a (non-erroneous) NOP.
186 */
Guido van Rossum053b8df1998-11-25 16:18:00 +0000187static int
Tim Peterscba30e22003-02-01 06:24:36 +0000188Pdata_clear(Pdata *self, int clearto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000189{
190 int i;
191 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000193 if (clearto < 0) return stackUnderflow();
194 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000195
Tim Peters1d63c9f2003-02-02 20:29:39 +0000196 for (i = self->length, p = self->data + clearto;
197 --i >= clearto;
198 p++) {
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000199 Py_CLEAR(*p);
Tim Peters1d63c9f2003-02-02 20:29:39 +0000200 }
201 self->length = clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000203 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000204}
205
Tim Peters84e87f32001-03-17 04:50:51 +0000206static int
Tim Peterscba30e22003-02-01 06:24:36 +0000207Pdata_grow(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000208{
Tim Peters1d63c9f2003-02-02 20:29:39 +0000209 int bigger;
210 size_t nbytes;
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000211 PyObject **tmp;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000212
Tim Peters1d63c9f2003-02-02 20:29:39 +0000213 bigger = self->size << 1;
Tim Peterse0a39072003-02-03 15:45:56 +0000214 if (bigger <= 0) /* was 0, or new value overflows */
Tim Peters1d63c9f2003-02-02 20:29:39 +0000215 goto nomemory;
216 if ((int)(size_t)bigger != bigger)
217 goto nomemory;
218 nbytes = (size_t)bigger * sizeof(PyObject *);
219 if (nbytes / sizeof(PyObject *) != (size_t)bigger)
220 goto nomemory;
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000221 tmp = realloc(self->data, nbytes);
222 if (tmp == NULL)
Tim Peters1d63c9f2003-02-02 20:29:39 +0000223 goto nomemory;
Neal Norwitzb59d08c2006-07-22 16:20:49 +0000224 self->data = tmp;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000225 self->size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000226 return 0;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000227
228 nomemory:
Tim Peters1d63c9f2003-02-02 20:29:39 +0000229 PyErr_NoMemory();
230 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000231}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000232
Tim Peterse0a39072003-02-03 15:45:56 +0000233/* D is a Pdata*. Pop the topmost element and store it into V, which
234 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
Tim Peters1d63c9f2003-02-02 20:29:39 +0000235 * is raised and V is set to NULL. D and V may be evaluated several times.
236 */
237#define PDATA_POP(D, V) { \
Tim Peterse0a39072003-02-03 15:45:56 +0000238 if ((D)->length) \
239 (V) = (D)->data[--((D)->length)]; \
240 else { \
241 PyErr_SetString(UnpicklingError, "bad pickle data"); \
242 (V) = NULL; \
243 } \
Guido van Rossum053b8df1998-11-25 16:18:00 +0000244}
245
Tim Peterse0a39072003-02-03 15:45:56 +0000246/* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata*
247 * D. If the Pdata stack can't be grown to hold the new value, both
248 * raise MemoryError and execute "return ER". The difference is in ownership
249 * of O after: _PUSH transfers ownership of O from the caller to the stack
250 * (no incref of O is done, and in case of error O is decrefed), while
251 * _APPEND pushes a new reference.
252 */
253
254/* Push O on stack D, giving ownership of O to the stack. */
255#define PDATA_PUSH(D, O, ER) { \
256 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
257 Pdata_grow((Pdata*)(D)) < 0) { \
258 Py_DECREF(O); \
259 return ER; \
260 } \
261 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
262}
263
264/* Push O on stack D, pushing a new reference. */
265#define PDATA_APPEND(D, O, ER) { \
266 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
267 Pdata_grow((Pdata*)(D)) < 0) \
268 return ER; \
269 Py_INCREF(O); \
270 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
271}
272
273
Guido van Rossum053b8df1998-11-25 16:18:00 +0000274static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000275Pdata_popTuple(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000276{
277 PyObject *r;
278 int i, j, l;
Tim Peterscba30e22003-02-01 06:24:36 +0000279
Tim Peters1d63c9f2003-02-02 20:29:39 +0000280 l = self->length-start;
281 r = PyTuple_New(l);
282 if (r == NULL)
283 return NULL;
284 for (i = start, j = 0 ; j < l; i++, j++)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000285 PyTuple_SET_ITEM(r, j, self->data[i]);
Tim Peterscba30e22003-02-01 06:24:36 +0000286
Tim Peters1d63c9f2003-02-02 20:29:39 +0000287 self->length = start;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000288 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000289}
290
291static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000292Pdata_popList(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000293{
294 PyObject *r;
295 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000297 l=self->length-start;
298 if (!( r=PyList_New(l))) return NULL;
299 for (i=start, j=0 ; j < l; i++, j++)
300 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000302 self->length=start;
303 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000304}
305
Guido van Rossum053b8df1998-11-25 16:18:00 +0000306/*************************************************************************/
307
308#define ARG_TUP(self, o) { \
309 if (self->arg || (self->arg=PyTuple_New(1))) { \
310 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
311 PyTuple_SET_ITEM(self->arg,0,o); \
312 } \
313 else { \
314 Py_DECREF(o); \
315 } \
316}
317
318#define FREE_ARG_TUP(self) { \
319 if (self->arg->ob_refcnt > 1) { \
320 Py_DECREF(self->arg); \
321 self->arg=NULL; \
322 } \
323 }
324
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000325typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000326 PyObject_HEAD
327 FILE *fp;
328 PyObject *write;
329 PyObject *file;
330 PyObject *memo;
331 PyObject *arg;
332 PyObject *pers_func;
333 PyObject *inst_pers_func;
Tim Peters797ec242003-02-01 06:22:36 +0000334
335 /* pickle protocol number, >= 0 */
336 int proto;
337
338 /* bool, true if proto > 0 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000339 int bin;
Tim Peters797ec242003-02-01 06:22:36 +0000340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000341 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis5a395302002-08-04 08:20:23 +0000342 int nesting;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000343 int (*write_func)(struct Picklerobject *, const char *, Py_ssize_t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000344 char *write_buf;
345 int buf_size;
346 PyObject *dispatch_table;
347 int fast_container; /* count nested container dumps */
348 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000349} Picklerobject;
350
Barry Warsaw52acb492001-12-21 20:04:22 +0000351#ifndef PY_CPICKLE_FAST_LIMIT
352#define PY_CPICKLE_FAST_LIMIT 50
353#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000354
Jeremy Hylton938ace62002-07-17 16:30:39 +0000355static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000356
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000357typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000358 PyObject_HEAD
359 FILE *fp;
360 PyObject *file;
361 PyObject *readline;
362 PyObject *read;
363 PyObject *memo;
364 PyObject *arg;
365 Pdata *stack;
366 PyObject *mark;
367 PyObject *pers_func;
368 PyObject *last_string;
369 int *marks;
370 int num_marks;
371 int marks_size;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000372 Py_ssize_t (*read_func)(struct Unpicklerobject *, char **, Py_ssize_t);
373 Py_ssize_t (*readline_func)(struct Unpicklerobject *, char **);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000374 int buf_size;
375 char *buf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000376 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000377} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000378
Jeremy Hylton938ace62002-07-17 16:30:39 +0000379static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000380
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000381/* Forward decls that need the above structs */
382static int save(Picklerobject *, PyObject *, int);
383static int put2(Picklerobject *, PyObject *);
384
Guido van Rossumd385d591997-04-09 17:47:47 +0000385static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000386PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000387cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
388{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000389 va_list va;
390 PyObject *args=0, *retval=0;
391 va_start(va, format);
Tim Peterscba30e22003-02-01 06:24:36 +0000392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000393 if (format) args = Py_VaBuildValue(format, va);
394 va_end(va);
395 if (format && ! args) return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000396 if (stringformat && !(retval=PyString_FromString(stringformat)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000397 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000399 if (retval) {
400 if (args) {
401 PyObject *v;
402 v=PyString_Format(retval, args);
403 Py_DECREF(retval);
404 Py_DECREF(args);
405 if (! v) return NULL;
406 retval=v;
407 }
408 }
409 else
410 if (args) retval=args;
411 else {
412 PyErr_SetObject(ErrType,Py_None);
413 return NULL;
414 }
415 PyErr_SetObject(ErrType,retval);
416 Py_DECREF(retval);
417 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000418}
419
Tim Peters84e87f32001-03-17 04:50:51 +0000420static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000421write_file(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000422{
423 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000425 if (s == NULL) {
426 return 0;
427 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000428
Martin v. Löwis18e16552006-02-15 17:27:45 +0000429 if (n > INT_MAX) {
430 /* String too large */
431 return -1;
432 }
433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000434 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000435 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000436 Py_END_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000437 if (nbyteswritten != (size_t)n) {
438 PyErr_SetFromErrno(PyExc_IOError);
439 return -1;
440 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000441
Martin v. Löwis18e16552006-02-15 17:27:45 +0000442 return (int)n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000443}
444
Tim Peters84e87f32001-03-17 04:50:51 +0000445static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000446write_cStringIO(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000447{
448 if (s == NULL) {
449 return 0;
450 }
Tim Peterscba30e22003-02-01 06:24:36 +0000451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000452 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
453 return -1;
454 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000455
Martin v. Löwis18e16552006-02-15 17:27:45 +0000456 return (int)n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000457}
458
Tim Peters84e87f32001-03-17 04:50:51 +0000459static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000460write_none(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000461{
462 if (s == NULL) return 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000463 if (n > INT_MAX) return -1;
464 return (int)n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000465}
466
Tim Peters84e87f32001-03-17 04:50:51 +0000467static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000468write_other(Picklerobject *self, const char *s, Py_ssize_t _n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000469{
470 PyObject *py_str = 0, *junk = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000471 int n;
Tim Peterscba30e22003-02-01 06:24:36 +0000472
Martin v. Löwis18e16552006-02-15 17:27:45 +0000473 if (_n > INT_MAX)
474 return -1;
475 n = (int)_n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000476 if (s == NULL) {
477 if (!( self->buf_size )) return 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000478 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000479 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000480 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000481 return -1;
482 }
483 else {
484 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
485 if (write_other(self, NULL, 0) < 0)
486 return -1;
487 }
Tim Peterscba30e22003-02-01 06:24:36 +0000488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000489 if (n > WRITE_BUF_SIZE) {
490 if (!( py_str =
Tim Peterscba30e22003-02-01 06:24:36 +0000491 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000492 return -1;
493 }
494 else {
495 memcpy(self->write_buf + self->buf_size, s, n);
496 self->buf_size += n;
497 return n;
498 }
499 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000501 if (self->write) {
502 /* object with write method */
503 ARG_TUP(self, py_str);
504 if (self->arg) {
505 junk = PyObject_Call(self->write, self->arg, NULL);
506 FREE_ARG_TUP(self);
507 }
508 if (junk) Py_DECREF(junk);
509 else return -1;
510 }
511 else
512 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000513
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000514 self->buf_size = 0;
515 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000516}
517
518
Martin v. Löwis18e16552006-02-15 17:27:45 +0000519static Py_ssize_t
520read_file(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000521{
522 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000524 if (self->buf_size == 0) {
525 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000527 size = ((n < 32) ? 32 : n);
Tim Petersee1a53c2003-02-02 02:57:53 +0000528 if (!( self->buf = (char *)malloc(size))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000529 PyErr_NoMemory();
530 return -1;
531 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000533 self->buf_size = size;
534 }
535 else if (n > self->buf_size) {
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +0000536 char *newbuf = (char *)realloc(self->buf, n);
537 if (!newbuf) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000538 PyErr_NoMemory();
539 return -1;
540 }
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +0000541 self->buf = newbuf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000542 self->buf_size = n;
543 }
Tim Peters84e87f32001-03-17 04:50:51 +0000544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000545 Py_BEGIN_ALLOW_THREADS
546 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
547 Py_END_ALLOW_THREADS
548 if (nbytesread != (size_t)n) {
549 if (feof(self->fp)) {
550 PyErr_SetNone(PyExc_EOFError);
551 return -1;
552 }
Tim Peterscba30e22003-02-01 06:24:36 +0000553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000554 PyErr_SetFromErrno(PyExc_IOError);
555 return -1;
556 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000558 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000559
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000560 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000561}
562
563
Martin v. Löwis18e16552006-02-15 17:27:45 +0000564static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000565readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000566{
567 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000569 if (self->buf_size == 0) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000570 if (!( self->buf = (char *)malloc(40))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000571 PyErr_NoMemory();
572 return -1;
573 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000574 self->buf_size = 40;
575 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000577 i = 0;
578 while (1) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000579 int bigger;
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +0000580 char *newbuf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000581 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000582 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000583 (self->buf[i] = getc(self->fp)) == '\n') {
584 self->buf[i + 1] = '\0';
585 *s = self->buf;
586 return i + 1;
587 }
588 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000589 bigger = self->buf_size << 1;
590 if (bigger <= 0) { /* overflow */
591 PyErr_NoMemory();
592 return -1;
593 }
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +0000594 newbuf = (char *)realloc(self->buf, bigger);
595 if (!newbuf) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000596 PyErr_NoMemory();
597 return -1;
598 }
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +0000599 self->buf = newbuf;
Tim Petersee1a53c2003-02-02 02:57:53 +0000600 self->buf_size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000601 }
Tim Peters84e87f32001-03-17 04:50:51 +0000602}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000603
604
Martin v. Löwis18e16552006-02-15 17:27:45 +0000605static Py_ssize_t
606read_cStringIO(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000607{
608 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000610 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
611 PyErr_SetNone(PyExc_EOFError);
612 return -1;
613 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000614
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000615 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000617 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000618}
619
620
Martin v. Löwis18e16552006-02-15 17:27:45 +0000621static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000622readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000623{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000624 Py_ssize_t n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000625 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000627 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
628 return -1;
629 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000631 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000632
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000633 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000634}
635
636
Martin v. Löwis18e16552006-02-15 17:27:45 +0000637static Py_ssize_t
638read_other(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000639{
640 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000641
Martin v. Löwis18e16552006-02-15 17:27:45 +0000642 if (!( bytes = PyInt_FromSsize_t(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000644 ARG_TUP(self, bytes);
645 if (self->arg) {
646 str = PyObject_Call(self->read, self->arg, NULL);
647 FREE_ARG_TUP(self);
648 }
649 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000651 Py_XDECREF(self->last_string);
652 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000654 if (! (*s = PyString_AsString(str))) return -1;
655 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000656}
657
658
Martin v. Löwis18e16552006-02-15 17:27:45 +0000659static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000660readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000661{
662 PyObject *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000663 Py_ssize_t str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000665 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
666 return -1;
667 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000669 if ((str_size = PyString_Size(str)) < 0)
670 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000672 Py_XDECREF(self->last_string);
673 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000675 if (! (*s = PyString_AsString(str)))
676 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000677
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000678 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000679}
680
Tim Petersee1a53c2003-02-02 02:57:53 +0000681/* Copy the first n bytes from s into newly malloc'ed memory, plus a
682 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
683 * The caller is responsible for free()'ing the return value.
684 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000685static char *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000686pystrndup(const char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000687{
Tim Petersee1a53c2003-02-02 02:57:53 +0000688 char *r = (char *)malloc(n+1);
689 if (r == NULL)
690 return (char*)PyErr_NoMemory();
691 memcpy(r, s, n);
692 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000693 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000694}
695
696
697static int
Tim Peterscba30e22003-02-01 06:24:36 +0000698get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000699{
700 PyObject *value, *mv;
701 long c_value;
702 char s[30];
703 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000705 if (!( mv = PyDict_GetItem(self->memo, id))) {
706 PyErr_SetObject(PyExc_KeyError, id);
707 return -1;
708 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000709
Tim Peterscba30e22003-02-01 06:24:36 +0000710 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000711 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000713 if (!( PyInt_Check(value))) {
714 PyErr_SetString(PicklingError, "no int where int expected in memo");
715 return -1;
716 }
717 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000718
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000719 if (!self->bin) {
720 s[0] = GET;
721 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
722 len = strlen(s);
723 }
724 else if (Pdata_Check(self->file)) {
725 if (write_other(self, NULL, 0) < 0) return -1;
726 PDATA_APPEND(self->file, mv, -1);
727 return 0;
728 }
729 else {
730 if (c_value < 256) {
731 s[0] = BINGET;
732 s[1] = (int)(c_value & 0xff);
733 len = 2;
734 }
735 else {
736 s[0] = LONG_BINGET;
737 s[1] = (int)(c_value & 0xff);
738 s[2] = (int)((c_value >> 8) & 0xff);
739 s[3] = (int)((c_value >> 16) & 0xff);
740 s[4] = (int)((c_value >> 24) & 0xff);
741 len = 5;
742 }
743 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000744
Tim Peters0bc93f52003-02-02 18:29:33 +0000745 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000746 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000747
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000748 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000749}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000750
Guido van Rossum60456fd1997-04-09 17:36:32 +0000751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000752static int
Tim Peterscba30e22003-02-01 06:24:36 +0000753put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000754{
Tim Peterscba30e22003-02-01 06:24:36 +0000755 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000756 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000758 return put2(self, ob);
759}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000760
Guido van Rossum053b8df1998-11-25 16:18:00 +0000761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000762static int
Tim Peterscba30e22003-02-01 06:24:36 +0000763put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000764{
765 char c_str[30];
766 int p;
767 size_t len;
768 int res = -1;
769 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000770
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000771 if (self->fast)
772 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000774 if ((p = PyDict_Size(self->memo)) < 0)
775 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000777 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000778 /* XXX Why?
779 * XXX And does "positive" really mean non-negative?
780 * XXX pickle.py starts with PUT index 0, not 1. This makes for
781 * XXX gratuitous differences between the pickling modules.
782 */
Tim Peterscba30e22003-02-01 06:24:36 +0000783 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000784
Tim Peterscba30e22003-02-01 06:24:36 +0000785 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000786 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000787
Tim Peterscba30e22003-02-01 06:24:36 +0000788 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000789 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000790
Tim Peterscba30e22003-02-01 06:24:36 +0000791 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000792 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000793
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000794 PyTuple_SET_ITEM(t, 0, memo_len);
795 Py_INCREF(memo_len);
796 PyTuple_SET_ITEM(t, 1, ob);
797 Py_INCREF(ob);
798
799 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
800 goto finally;
801
802 if (!self->bin) {
803 c_str[0] = PUT;
804 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
805 len = strlen(c_str);
806 }
807 else if (Pdata_Check(self->file)) {
808 if (write_other(self, NULL, 0) < 0) return -1;
809 PDATA_APPEND(self->file, memo_len, -1);
810 res=0; /* Job well done ;) */
811 goto finally;
812 }
813 else {
814 if (p >= 256) {
815 c_str[0] = LONG_BINPUT;
816 c_str[1] = (int)(p & 0xff);
817 c_str[2] = (int)((p >> 8) & 0xff);
818 c_str[3] = (int)((p >> 16) & 0xff);
819 c_str[4] = (int)((p >> 24) & 0xff);
820 len = 5;
821 }
822 else {
823 c_str[0] = BINPUT;
824 c_str[1] = p;
825 len = 2;
826 }
827 }
828
Tim Peters0bc93f52003-02-02 18:29:33 +0000829 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000830 goto finally;
831
832 res = 0;
833
834 finally:
835 Py_XDECREF(py_ob_id);
836 Py_XDECREF(memo_len);
837 Py_XDECREF(t);
838
839 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000840}
841
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000842static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000843whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000844{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000845 Py_ssize_t i, j;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000846 PyObject *module = 0, *modules_dict = 0,
847 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000848
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000849 module = PyObject_GetAttrString(global, "__module__");
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000850 if (module)
851 return module;
852 if (PyErr_ExceptionMatches(PyExc_AttributeError))
853 PyErr_Clear();
854 else
855 return NULL;
Guido van Rossum45188231997-09-28 05:38:51 +0000856
Tim Peterscba30e22003-02-01 06:24:36 +0000857 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000858 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000860 i = 0;
861 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000862
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000863 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000865 global_name_attr = PyObject_GetAttr(module, global_name);
866 if (!global_name_attr) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000867 if (PyErr_ExceptionMatches(PyExc_AttributeError))
868 PyErr_Clear();
869 else
870 return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000871 continue;
872 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000874 if (global_name_attr != global) {
875 Py_DECREF(global_name_attr);
876 continue;
877 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000879 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000880
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000881 break;
882 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000884 /* The following implements the rule in pickle.py added in 1.5
885 that used __main__ if no module is found. I don't actually
886 like this rule. jlf
887 */
888 if (!j) {
889 j=1;
890 name=__main___str;
891 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000892
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000893 Py_INCREF(name);
894 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000895}
896
897
Guido van Rossum60456fd1997-04-09 17:36:32 +0000898static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000899fast_save_enter(Picklerobject *self, PyObject *obj)
900{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000901 /* if fast_container < 0, we're doing an error exit. */
902 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
903 PyObject *key = NULL;
904 if (self->fast_memo == NULL) {
905 self->fast_memo = PyDict_New();
906 if (self->fast_memo == NULL) {
907 self->fast_container = -1;
908 return 0;
909 }
910 }
911 key = PyLong_FromVoidPtr(obj);
912 if (key == NULL)
913 return 0;
914 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000915 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000916 PyErr_Format(PyExc_ValueError,
Tim Peters92c8bb32003-02-13 23:00:26 +0000917 "fast mode: can't pickle cyclic objects "
918 "including object type %s at %p",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000919 obj->ob_type->tp_name, obj);
920 self->fast_container = -1;
921 return 0;
922 }
923 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000924 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000925 self->fast_container = -1;
926 return 0;
927 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000928 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000929 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000930 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000931}
932
Tim Peterscba30e22003-02-01 06:24:36 +0000933int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000934fast_save_leave(Picklerobject *self, PyObject *obj)
935{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000936 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
937 PyObject *key = PyLong_FromVoidPtr(obj);
938 if (key == NULL)
939 return 0;
940 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000941 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000942 return 0;
943 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000944 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000945 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000946 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000947}
948
949static int
Tim Peterscba30e22003-02-01 06:24:36 +0000950save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000951{
952 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000953 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000954 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000955
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000956 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000957}
958
Guido van Rossum77f6a652002-04-03 22:41:51 +0000959static int
Tim Peterscba30e22003-02-01 06:24:36 +0000960save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000961{
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000962 static const char *buf[2] = {FALSE, TRUE};
Guido van Rossume2763392002-04-05 19:30:08 +0000963 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000964 long l = PyInt_AS_LONG((PyIntObject *)args);
965
Tim Peters3c67d792003-02-02 17:59:11 +0000966 if (self->proto >= 2) {
967 char opcode = l ? NEWTRUE : NEWFALSE;
968 if (self->write_func(self, &opcode, 1) < 0)
969 return -1;
970 }
971 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000972 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000973 return 0;
974}
Tim Peters84e87f32001-03-17 04:50:51 +0000975
Guido van Rossum60456fd1997-04-09 17:36:32 +0000976static int
Tim Peterscba30e22003-02-01 06:24:36 +0000977save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000978{
979 char c_str[32];
980 long l = PyInt_AS_LONG((PyIntObject *)args);
981 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000983 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000984#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000985 || l > 0x7fffffffL
986 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000987#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000988 ) {
989 /* Text-mode pickle, or long too big to fit in the 4-byte
990 * signed BININT format: store as a string.
991 */
992 c_str[0] = INT;
993 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +0000994 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000995 return -1;
996 }
997 else {
998 /* Binary pickle and l fits in a signed 4-byte int. */
999 c_str[1] = (int)( l & 0xff);
1000 c_str[2] = (int)((l >> 8) & 0xff);
1001 c_str[3] = (int)((l >> 16) & 0xff);
1002 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001004 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1005 if (c_str[2] == 0) {
1006 c_str[0] = BININT1;
1007 len = 2;
1008 }
1009 else {
1010 c_str[0] = BININT2;
1011 len = 3;
1012 }
1013 }
1014 else {
1015 c_str[0] = BININT;
1016 len = 5;
1017 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001018
Tim Peters0bc93f52003-02-02 18:29:33 +00001019 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001020 return -1;
1021 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001022
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001023 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001024}
1025
1026
1027static int
Tim Peterscba30e22003-02-01 06:24:36 +00001028save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001029{
Armin Rigo4b63c212006-10-04 11:44:06 +00001030 Py_ssize_t size;
Tim Petersee1a53c2003-02-02 02:57:53 +00001031 int res = -1;
1032 PyObject *repr = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001034 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001035
Tim Petersee1a53c2003-02-02 02:57:53 +00001036 if (self->proto >= 2) {
1037 /* Linear-time pickling. */
1038 size_t nbits;
1039 size_t nbytes;
1040 unsigned char *pdata;
1041 char c_str[5];
1042 int i;
1043 int sign = _PyLong_Sign(args);
1044
1045 if (sign == 0) {
1046 /* It's 0 -- an empty bytestring. */
1047 c_str[0] = LONG1;
1048 c_str[1] = 0;
1049 i = self->write_func(self, c_str, 2);
1050 if (i < 0) goto finally;
1051 res = 0;
1052 goto finally;
1053 }
1054 nbits = _PyLong_NumBits(args);
1055 if (nbits == (size_t)-1 && PyErr_Occurred())
1056 goto finally;
1057 /* How many bytes do we need? There are nbits >> 3 full
1058 * bytes of data, and nbits & 7 leftover bits. If there
1059 * are any leftover bits, then we clearly need another
1060 * byte. Wnat's not so obvious is that we *probably*
1061 * need another byte even if there aren't any leftovers:
1062 * the most-significant bit of the most-significant byte
1063 * acts like a sign bit, and it's usually got a sense
1064 * opposite of the one we need. The exception is longs
1065 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1066 * its own 256's-complement, so has the right sign bit
1067 * even without the extra byte. That's a pain to check
1068 * for in advance, though, so we always grab an extra
1069 * byte at the start, and cut it back later if possible.
1070 */
1071 nbytes = (nbits >> 3) + 1;
Armin Rigo4b63c212006-10-04 11:44:06 +00001072 if (nbytes > INT_MAX) {
Tim Petersee1a53c2003-02-02 02:57:53 +00001073 PyErr_SetString(PyExc_OverflowError, "long too large "
1074 "to pickle");
1075 goto finally;
1076 }
1077 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
1078 if (repr == NULL) goto finally;
1079 pdata = (unsigned char *)PyString_AS_STRING(repr);
1080 i = _PyLong_AsByteArray((PyLongObject *)args,
1081 pdata, nbytes,
1082 1 /* little endian */, 1 /* signed */);
1083 if (i < 0) goto finally;
1084 /* If the long is negative, this may be a byte more than
1085 * needed. This is so iff the MSB is all redundant sign
1086 * bits.
1087 */
1088 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1089 (pdata[nbytes - 2] & 0x80) != 0)
1090 --nbytes;
1091
1092 if (nbytes < 256) {
1093 c_str[0] = LONG1;
1094 c_str[1] = (char)nbytes;
1095 size = 2;
1096 }
1097 else {
1098 c_str[0] = LONG4;
1099 size = (int)nbytes;
1100 for (i = 1; i < 5; i++) {
1101 c_str[i] = (char)(size & 0xff);
1102 size >>= 8;
1103 }
1104 size = 5;
1105 }
1106 i = self->write_func(self, c_str, size);
1107 if (i < 0) goto finally;
1108 i = self->write_func(self, (char *)pdata, (int)nbytes);
1109 if (i < 0) goto finally;
1110 res = 0;
1111 goto finally;
1112 }
1113
1114 /* proto < 2: write the repr and newline. This is quadratic-time
1115 * (in the number of digits), in both directions.
1116 */
Tim Peterscba30e22003-02-01 06:24:36 +00001117 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001118 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001120 if ((size = PyString_Size(repr)) < 0)
1121 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001122
Tim Peters0bc93f52003-02-02 18:29:33 +00001123 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001124 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001125
Tim Peters0bc93f52003-02-02 18:29:33 +00001126 if (self->write_func(self,
1127 PyString_AS_STRING((PyStringObject *)repr),
1128 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001129 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001130
Tim Peters0bc93f52003-02-02 18:29:33 +00001131 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001132 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001133
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001134 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001136 finally:
1137 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001138 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001139}
1140
1141
1142static int
Tim Peterscba30e22003-02-01 06:24:36 +00001143save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001144{
1145 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001146
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001147 if (self->bin) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001148 char str[9];
Tim Peters9905b942003-03-20 20:53:32 +00001149 str[0] = BINFLOAT;
1150 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001151 return -1;
Tim Peters0bc93f52003-02-02 18:29:33 +00001152 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001153 return -1;
1154 }
1155 else {
1156 char c_str[250];
1157 c_str[0] = FLOAT;
Georg Brandlde9b6242006-04-30 11:13:56 +00001158 PyOS_ascii_formatd(c_str + 1, sizeof(c_str) - 2, "%.17g", x);
1159 /* Extend the formatted string with a newline character */
1160 strcat(c_str, "\n");
Guido van Rossum60456fd1997-04-09 17:36:32 +00001161
Tim Peters0bc93f52003-02-02 18:29:33 +00001162 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001163 return -1;
1164 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001166 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001167}
1168
1169
1170static int
Tim Peterscba30e22003-02-01 06:24:36 +00001171save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001172{
1173 int size, len;
1174 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001175
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001176 if ((size = PyString_Size(args)) < 0)
1177 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001179 if (!self->bin) {
1180 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001182 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001183
Tim Peterscba30e22003-02-01 06:24:36 +00001184 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001185 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001186
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001187 if ((len = PyString_Size(repr)) < 0)
1188 goto err;
1189 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001190
Tim Peters0bc93f52003-02-02 18:29:33 +00001191 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001192 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001193
Tim Peters0bc93f52003-02-02 18:29:33 +00001194 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001195 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001196
Tim Peters0bc93f52003-02-02 18:29:33 +00001197 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001198 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001200 Py_XDECREF(repr);
1201 }
1202 else {
1203 int i;
1204 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001206 if ((size = PyString_Size(args)) < 0)
1207 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001208
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001209 if (size < 256) {
1210 c_str[0] = SHORT_BINSTRING;
1211 c_str[1] = size;
1212 len = 2;
1213 }
Armin Rigo4b63c212006-10-04 11:44:06 +00001214 else if (size <= INT_MAX) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001215 c_str[0] = BINSTRING;
1216 for (i = 1; i < 5; i++)
1217 c_str[i] = (int)(size >> ((i - 1) * 8));
1218 len = 5;
1219 }
Armin Rigo4b63c212006-10-04 11:44:06 +00001220 else
1221 return -1; /* string too large */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001222
Tim Peters0bc93f52003-02-02 18:29:33 +00001223 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001224 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001226 if (size > 128 && Pdata_Check(self->file)) {
1227 if (write_other(self, NULL, 0) < 0) return -1;
1228 PDATA_APPEND(self->file, args, -1);
1229 }
1230 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001231 if (self->write_func(self,
1232 PyString_AS_STRING(
1233 (PyStringObject *)args),
1234 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001235 return -1;
1236 }
1237 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001238
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001239 if (doput)
1240 if (put(self, args) < 0)
1241 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001243 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001245 err:
1246 Py_XDECREF(repr);
1247 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001248}
1249
1250
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001251#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001252/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1253 backslash and newline characters to \uXXXX escapes. */
1254static PyObject *
1255modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1256{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001257 PyObject *repr;
1258 char *p;
1259 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001260
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001261 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001262
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001263 repr = PyString_FromStringAndSize(NULL, 6 * size);
1264 if (repr == NULL)
1265 return NULL;
1266 if (size == 0)
1267 return repr;
1268
1269 p = q = PyString_AS_STRING(repr);
1270 while (size-- > 0) {
1271 Py_UNICODE ch = *s++;
1272 /* Map 16-bit characters to '\uxxxx' */
1273 if (ch >= 256 || ch == '\\' || ch == '\n') {
1274 *p++ = '\\';
1275 *p++ = 'u';
1276 *p++ = hexdigit[(ch >> 12) & 0xf];
1277 *p++ = hexdigit[(ch >> 8) & 0xf];
1278 *p++ = hexdigit[(ch >> 4) & 0xf];
1279 *p++ = hexdigit[ch & 15];
1280 }
1281 /* Copy everything else as-is */
1282 else
1283 *p++ = (char) ch;
1284 }
1285 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001286 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001287 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001288}
1289
1290
Guido van Rossum60456fd1997-04-09 17:36:32 +00001291static int
Tim Peterscba30e22003-02-01 06:24:36 +00001292save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001293{
Armin Rigo4b63c212006-10-04 11:44:06 +00001294 Py_ssize_t size, len;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001295 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001297 if (!PyUnicode_Check(args))
1298 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001300 if (!self->bin) {
1301 char *repr_str;
1302 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001304 repr = modified_EncodeRawUnicodeEscape(
1305 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001306 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001307 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001308
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001309 if ((len = PyString_Size(repr)) < 0)
1310 goto err;
1311 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001312
Tim Peters0bc93f52003-02-02 18:29:33 +00001313 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001314 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001315
Tim Peters0bc93f52003-02-02 18:29:33 +00001316 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001317 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001318
Tim Peters0bc93f52003-02-02 18:29:33 +00001319 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001320 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001322 Py_XDECREF(repr);
1323 }
1324 else {
1325 int i;
1326 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001327
Tim Peterscba30e22003-02-01 06:24:36 +00001328 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001329 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001331 if ((size = PyString_Size(repr)) < 0)
1332 goto err;
Armin Rigo4b63c212006-10-04 11:44:06 +00001333 if (size > INT_MAX)
1334 return -1; /* string too large */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001336 c_str[0] = BINUNICODE;
1337 for (i = 1; i < 5; i++)
1338 c_str[i] = (int)(size >> ((i - 1) * 8));
1339 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001340
Tim Peters0bc93f52003-02-02 18:29:33 +00001341 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001342 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001343
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001344 if (size > 128 && Pdata_Check(self->file)) {
1345 if (write_other(self, NULL, 0) < 0)
1346 goto err;
1347 PDATA_APPEND(self->file, repr, -1);
1348 }
1349 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001350 if (self->write_func(self, PyString_AS_STRING(repr),
1351 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001352 goto err;
1353 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001355 Py_DECREF(repr);
1356 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001358 if (doput)
1359 if (put(self, args) < 0)
1360 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001362 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001363
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001364 err:
1365 Py_XDECREF(repr);
1366 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001367}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001368#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001369
Tim Peters1d63c9f2003-02-02 20:29:39 +00001370/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1371static int
Tim Peters67920142003-02-05 03:46:17 +00001372store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001373{
1374 int i;
1375 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001376
Tim Peters1d63c9f2003-02-02 20:29:39 +00001377 assert(PyTuple_Size(t) == len);
1378
1379 for (i = 0; i < len; i++) {
1380 PyObject *element = PyTuple_GET_ITEM(t, i);
1381
1382 if (element == NULL)
1383 goto finally;
1384 if (save(self, element, 0) < 0)
1385 goto finally;
1386 }
1387 res = 0;
1388
1389 finally:
1390 return res;
1391}
1392
1393/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1394 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001395 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001396 * (a tuple can be reached from itself), and that requires some subtle
1397 * magic so that it works in all cases. IOW, this is a long routine.
1398 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001399static int
Tim Peterscba30e22003-02-01 06:24:36 +00001400save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001401{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001402 PyObject *py_tuple_id = NULL;
1403 int len, i;
1404 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001406 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001407 static char pop = POP;
1408 static char pop_mark = POP_MARK;
1409 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001411 if ((len = PyTuple_Size(args)) < 0)
1412 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001413
Tim Peters1d63c9f2003-02-02 20:29:39 +00001414 if (len == 0) {
1415 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001416
Tim Peters1d63c9f2003-02-02 20:29:39 +00001417 if (self->proto) {
1418 c_str[0] = EMPTY_TUPLE;
1419 len = 1;
1420 }
1421 else {
1422 c_str[0] = MARK;
1423 c_str[1] = TUPLE;
1424 len = 2;
1425 }
1426 if (self->write_func(self, c_str, len) >= 0)
1427 res = 0;
1428 /* Don't memoize an empty tuple. */
1429 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001430 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001431
Tim Peters1d63c9f2003-02-02 20:29:39 +00001432 /* A non-empty tuple. */
1433
1434 /* id(tuple) isn't in the memo now. If it shows up there after
1435 * saving the tuple elements, the tuple must be recursive, in
1436 * which case we'll pop everything we put on the stack, and fetch
1437 * its value from the memo.
1438 */
1439 py_tuple_id = PyLong_FromVoidPtr(args);
1440 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001441 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001442
Tim Peters1d63c9f2003-02-02 20:29:39 +00001443 if (len <= 3 && self->proto >= 2) {
1444 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001445 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001446 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001447 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001448 /* pop the len elements */
1449 for (i = 0; i < len; ++i)
1450 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001451 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001452 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001453 if (get(self, py_tuple_id) < 0)
1454 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001455 res = 0;
1456 goto finally;
1457 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001458 /* Not recursive. */
1459 if (self->write_func(self, len2opcode + len, 1) < 0)
1460 goto finally;
1461 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001462 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001463
Tim Peters1d63c9f2003-02-02 20:29:39 +00001464 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1465 * Generate MARK elt1 elt2 ... TUPLE
1466 */
1467 if (self->write_func(self, &MARKv, 1) < 0)
1468 goto finally;
1469
Tim Peters67920142003-02-05 03:46:17 +00001470 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001471 goto finally;
1472
1473 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1474 /* pop the stack stuff we pushed */
1475 if (self->bin) {
1476 if (self->write_func(self, &pop_mark, 1) < 0)
1477 goto finally;
1478 }
1479 else {
1480 /* Note that we pop one more than len, to remove
1481 * the MARK too.
1482 */
1483 for (i = 0; i <= len; i++)
1484 if (self->write_func(self, &pop, 1) < 0)
1485 goto finally;
1486 }
1487 /* fetch from memo */
1488 if (get(self, py_tuple_id) >= 0)
1489 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001490 goto finally;
1491 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001492
Tim Peters1d63c9f2003-02-02 20:29:39 +00001493 /* Not recursive. */
1494 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001495 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001496
Tim Peters1d63c9f2003-02-02 20:29:39 +00001497 memoize:
1498 if (put(self, args) >= 0)
1499 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001501 finally:
1502 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001503 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001504}
1505
Tim Peters1092d642003-02-11 21:06:20 +00001506/* iter is an iterator giving items, and we batch up chunks of
1507 * MARK item item ... item APPENDS
1508 * opcode sequences. Calling code should have arranged to first create an
1509 * empty list, or list-like object, for the APPENDS to operate on.
1510 * Returns 0 on success, <0 on error.
1511 */
1512static int
1513batch_list(Picklerobject *self, PyObject *iter)
1514{
1515 PyObject *obj;
1516 PyObject *slice[BATCHSIZE];
1517 int i, n;
1518
1519 static char append = APPEND;
1520 static char appends = APPENDS;
1521
1522 assert(iter != NULL);
1523
1524 if (self->proto == 0) {
1525 /* APPENDS isn't available; do one at a time. */
1526 for (;;) {
1527 obj = PyIter_Next(iter);
1528 if (obj == NULL) {
1529 if (PyErr_Occurred())
1530 return -1;
1531 break;
1532 }
1533 i = save(self, obj, 0);
1534 Py_DECREF(obj);
1535 if (i < 0)
1536 return -1;
1537 if (self->write_func(self, &append, 1) < 0)
1538 return -1;
Tim Peters1092d642003-02-11 21:06:20 +00001539 }
1540 return 0;
1541 }
1542
1543 /* proto > 0: write in batches of BATCHSIZE. */
1544 do {
1545 /* Get next group of (no more than) BATCHSIZE elements. */
1546 for (n = 0; n < BATCHSIZE; ++n) {
1547 obj = PyIter_Next(iter);
1548 if (obj == NULL) {
1549 if (PyErr_Occurred())
1550 goto BatchFailed;
1551 break;
1552 }
1553 slice[n] = obj;
1554 }
1555
1556 if (n > 1) {
1557 /* Pump out MARK, slice[0:n], APPENDS. */
1558 if (self->write_func(self, &MARKv, 1) < 0)
1559 goto BatchFailed;
1560 for (i = 0; i < n; ++i) {
1561 if (save(self, slice[i], 0) < 0)
1562 goto BatchFailed;
1563 }
1564 if (self->write_func(self, &appends, 1) < 0)
1565 goto BatchFailed;
1566 }
1567 else if (n == 1) {
1568 if (save(self, slice[0], 0) < 0)
1569 goto BatchFailed;
1570 if (self->write_func(self, &append, 1) < 0)
1571 goto BatchFailed;
1572 }
1573
1574 for (i = 0; i < n; ++i) {
1575 Py_DECREF(slice[i]);
1576 }
Tim Peters90975f12003-02-12 05:28:58 +00001577 } while (n == BATCHSIZE);
Tim Peters1092d642003-02-11 21:06:20 +00001578 return 0;
1579
1580BatchFailed:
1581 while (--n >= 0) {
1582 Py_DECREF(slice[n]);
1583 }
1584 return -1;
1585}
1586
Guido van Rossum60456fd1997-04-09 17:36:32 +00001587static int
Tim Peterscba30e22003-02-01 06:24:36 +00001588save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001589{
Tim Peters1092d642003-02-11 21:06:20 +00001590 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001591 char s[3];
Tim Peters1092d642003-02-11 21:06:20 +00001592 int len;
1593 PyObject *iter;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001594
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001595 if (self->fast && !fast_save_enter(self, args))
1596 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001597
Tim Peters1092d642003-02-11 21:06:20 +00001598 /* Create an empty list. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001599 if (self->bin) {
1600 s[0] = EMPTY_LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001601 len = 1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001602 }
1603 else {
1604 s[0] = MARK;
1605 s[1] = LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001606 len = 2;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001607 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001608
Tim Peters1092d642003-02-11 21:06:20 +00001609 if (self->write_func(self, s, len) < 0)
1610 goto finally;
1611
1612 /* Get list length, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001613 if ((len = PyList_Size(args)) < 0)
1614 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001615
Tim Peters1092d642003-02-11 21:06:20 +00001616 /* Memoize. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001617 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001618 if (put(self, args) >= 0)
1619 res = 0;
1620 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001621 }
Tim Peters90975f12003-02-12 05:28:58 +00001622 if (put2(self, args) < 0)
1623 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001624
Tim Peters1092d642003-02-11 21:06:20 +00001625 /* Materialize the list elements. */
1626 iter = PyObject_GetIter(args);
1627 if (iter == NULL)
1628 goto finally;
1629 res = batch_list(self, iter);
1630 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001631
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001632 finally:
1633 if (self->fast && !fast_save_leave(self, args))
1634 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001635
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001636 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001637}
1638
1639
Tim Peters42f08ac2003-02-11 22:43:24 +00001640/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1641 * MARK key value ... key value SETITEMS
1642 * opcode sequences. Calling code should have arranged to first create an
1643 * empty dict, or dict-like object, for the SETITEMS to operate on.
1644 * Returns 0 on success, <0 on error.
1645 *
1646 * This is very much like batch_list(). The difference between saving
1647 * elements directly, and picking apart two-tuples, is so long-winded at
1648 * the C level, though, that attempts to combine these routines were too
1649 * ugly to bear.
1650 */
1651static int
1652batch_dict(Picklerobject *self, PyObject *iter)
1653{
1654 PyObject *p;
1655 PyObject *slice[BATCHSIZE];
1656 int i, n;
1657
1658 static char setitem = SETITEM;
1659 static char setitems = SETITEMS;
1660
1661 assert(iter != NULL);
1662
1663 if (self->proto == 0) {
1664 /* SETITEMS isn't available; do one at a time. */
1665 for (;;) {
1666 p = PyIter_Next(iter);
1667 if (p == NULL) {
1668 if (PyErr_Occurred())
1669 return -1;
1670 break;
1671 }
1672 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1673 PyErr_SetString(PyExc_TypeError, "dict items "
1674 "iterator must return 2-tuples");
1675 return -1;
1676 }
1677 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1678 if (i >= 0)
1679 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1680 Py_DECREF(p);
1681 if (i < 0)
1682 return -1;
1683 if (self->write_func(self, &setitem, 1) < 0)
1684 return -1;
Tim Peters42f08ac2003-02-11 22:43:24 +00001685 }
1686 return 0;
1687 }
1688
1689 /* proto > 0: write in batches of BATCHSIZE. */
1690 do {
1691 /* Get next group of (no more than) BATCHSIZE elements. */
1692 for (n = 0; n < BATCHSIZE; ++n) {
1693 p = PyIter_Next(iter);
1694 if (p == NULL) {
1695 if (PyErr_Occurred())
1696 goto BatchFailed;
1697 break;
1698 }
1699 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1700 PyErr_SetString(PyExc_TypeError, "dict items "
1701 "iterator must return 2-tuples");
1702 goto BatchFailed;
1703 }
1704 slice[n] = p;
1705 }
1706
1707 if (n > 1) {
1708 /* Pump out MARK, slice[0:n], SETITEMS. */
1709 if (self->write_func(self, &MARKv, 1) < 0)
1710 goto BatchFailed;
1711 for (i = 0; i < n; ++i) {
1712 p = slice[i];
1713 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1714 goto BatchFailed;
1715 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1716 goto BatchFailed;
1717 }
1718 if (self->write_func(self, &setitems, 1) < 0)
1719 goto BatchFailed;
1720 }
1721 else if (n == 1) {
1722 p = slice[0];
1723 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1724 goto BatchFailed;
1725 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1726 goto BatchFailed;
1727 if (self->write_func(self, &setitem, 1) < 0)
1728 goto BatchFailed;
1729 }
1730
1731 for (i = 0; i < n; ++i) {
1732 Py_DECREF(slice[i]);
1733 }
Tim Peters90975f12003-02-12 05:28:58 +00001734 } while (n == BATCHSIZE);
Tim Peters42f08ac2003-02-11 22:43:24 +00001735 return 0;
1736
1737BatchFailed:
1738 while (--n >= 0) {
1739 Py_DECREF(slice[n]);
1740 }
1741 return -1;
1742}
1743
Guido van Rossum60456fd1997-04-09 17:36:32 +00001744static int
Tim Peterscba30e22003-02-01 06:24:36 +00001745save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001746{
Tim Peters42f08ac2003-02-11 22:43:24 +00001747 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001748 char s[3];
Tim Peters42f08ac2003-02-11 22:43:24 +00001749 int len;
1750 PyObject *iter;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001752 if (self->fast && !fast_save_enter(self, args))
1753 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001754
Tim Peters42f08ac2003-02-11 22:43:24 +00001755 /* Create an empty dict. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001756 if (self->bin) {
1757 s[0] = EMPTY_DICT;
1758 len = 1;
1759 }
1760 else {
1761 s[0] = MARK;
1762 s[1] = DICT;
1763 len = 2;
1764 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001765
Tim Peters0bc93f52003-02-02 18:29:33 +00001766 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001767 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001768
Tim Peters42f08ac2003-02-11 22:43:24 +00001769 /* Get dict size, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001770 if ((len = PyDict_Size(args)) < 0)
1771 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001773 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001774 if (put(self, args) >= 0)
1775 res = 0;
1776 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001777 }
Tim Peters90975f12003-02-12 05:28:58 +00001778 if (put2(self, args) < 0)
1779 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001780
Tim Peters42f08ac2003-02-11 22:43:24 +00001781 /* Materialize the dict items. */
1782 iter = PyObject_CallMethod(args, "iteritems", "()");
1783 if (iter == NULL)
1784 goto finally;
1785 res = batch_dict(self, iter);
1786 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001788 finally:
1789 if (self->fast && !fast_save_leave(self, args))
1790 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001792 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001793}
1794
1795
Tim Peters84e87f32001-03-17 04:50:51 +00001796static int
Tim Peterscba30e22003-02-01 06:24:36 +00001797save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001798{
1799 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1800 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1801 char *module_str, *name_str;
1802 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001803
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001804 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001805
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001806 if (self->fast && !fast_save_enter(self, args))
1807 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001808
Tim Peters0bc93f52003-02-02 18:29:33 +00001809 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001810 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001811
Tim Peterscba30e22003-02-01 06:24:36 +00001812 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001813 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001815 if (self->bin) {
1816 if (save(self, class, 0) < 0)
1817 goto finally;
1818 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001819
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001820 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1821 PyObject *element = 0;
1822 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001824 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00001825 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001826 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001828 if ((len = PyObject_Size(class_args)) < 0)
1829 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001831 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001832 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001833 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001835 if (save(self, element, 0) < 0) {
1836 Py_DECREF(element);
1837 goto finally;
1838 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001839
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001840 Py_DECREF(element);
1841 }
1842 }
1843 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00001844 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1845 PyErr_Clear();
1846 else
1847 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001848 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001850 if (!self->bin) {
1851 if (!( name = ((PyClassObject *)class)->cl_name )) {
1852 PyErr_SetString(PicklingError, "class has no name");
1853 goto finally;
1854 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001855
Tim Peterscba30e22003-02-01 06:24:36 +00001856 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001857 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001858
Tim Peters84e87f32001-03-17 04:50:51 +00001859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001860 if ((module_size = PyString_Size(module)) < 0 ||
1861 (name_size = PyString_Size(name)) < 0)
1862 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001864 module_str = PyString_AS_STRING((PyStringObject *)module);
1865 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001866
Tim Peters0bc93f52003-02-02 18:29:33 +00001867 if (self->write_func(self, &inst, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001868 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001869
Tim Peters0bc93f52003-02-02 18:29:33 +00001870 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001871 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001872
Tim Peters0bc93f52003-02-02 18:29:33 +00001873 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001874 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001875
Tim Peters0bc93f52003-02-02 18:29:33 +00001876 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001877 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001878
Tim Peters0bc93f52003-02-02 18:29:33 +00001879 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001880 goto finally;
1881 }
Tim Peters0bc93f52003-02-02 18:29:33 +00001882 else if (self->write_func(self, &obj, 1) < 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001883 goto finally;
1884 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001886 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1887 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00001888 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001889 goto finally;
1890 }
1891 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00001892 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1893 PyErr_Clear();
1894 else
1895 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001896
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001897 if (!( state = PyObject_GetAttr(args, __dict___str))) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00001898 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1899 PyErr_Clear();
1900 else
1901 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001902 res = 0;
1903 goto finally;
1904 }
1905 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001906
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001907 if (!PyDict_Check(state)) {
1908 if (put2(self, args) < 0)
1909 goto finally;
1910 }
1911 else {
1912 if (put(self, args) < 0)
1913 goto finally;
1914 }
Tim Peters84e87f32001-03-17 04:50:51 +00001915
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001916 if (save(self, state, 0) < 0)
1917 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001918
Tim Peters0bc93f52003-02-02 18:29:33 +00001919 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001920 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001921
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001922 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001924 finally:
1925 if (self->fast && !fast_save_leave(self, args))
1926 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001927
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001928 Py_XDECREF(module);
1929 Py_XDECREF(class);
1930 Py_XDECREF(state);
1931 Py_XDECREF(getinitargs_func);
1932 Py_XDECREF(getstate_func);
1933 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001935 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001936}
1937
1938
Guido van Rossum60456fd1997-04-09 17:36:32 +00001939static int
Tim Peterscba30e22003-02-01 06:24:36 +00001940save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001941{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001942 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001943 char *name_str, *module_str;
1944 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001946 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001948 if (name) {
1949 global_name = name;
1950 Py_INCREF(global_name);
1951 }
1952 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001953 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001954 goto finally;
1955 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001956
Tim Peterscba30e22003-02-01 06:24:36 +00001957 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001958 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001959
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001960 if ((module_size = PyString_Size(module)) < 0 ||
1961 (name_size = PyString_Size(global_name)) < 0)
1962 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001963
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001964 module_str = PyString_AS_STRING((PyStringObject *)module);
1965 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001966
Guido van Rossum75bfd052002-12-24 18:10:07 +00001967 /* XXX This can be doing a relative import. Clearly it shouldn't,
1968 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001969 mod = PyImport_ImportModule(module_str);
1970 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001971 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001972 "Can't pickle %s: import of module %s "
1973 "failed",
1974 "OS", args, module);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001975 goto finally;
1976 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001977 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001978 if (klass == NULL) {
1979 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001980 "Can't pickle %s: attribute lookup %s.%s "
1981 "failed",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001982 "OSS", args, module, global_name);
1983 goto finally;
1984 }
1985 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001986 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001987 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00001988 "Can't pickle %s: it's not the same object "
1989 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001990 "OSS", args, module, global_name);
1991 goto finally;
1992 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001993 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001994
Tim Peters731098b2003-02-04 20:56:09 +00001995 if (self->proto >= 2) {
1996 /* See whether this is in the extension registry, and if
1997 * so generate an EXT opcode.
1998 */
1999 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00002000 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00002001 char c_str[5];
2002 int n;
2003
2004 PyTuple_SET_ITEM(two_tuple, 0, module);
2005 PyTuple_SET_ITEM(two_tuple, 1, global_name);
2006 py_code = PyDict_GetItem(extension_registry, two_tuple);
2007 if (py_code == NULL)
2008 goto gen_global; /* not registered */
2009
2010 /* Verify py_code has the right type and value. */
2011 if (!PyInt_Check(py_code)) {
2012 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00002013 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00002014 "OO", args, py_code);
2015 goto finally;
2016 }
2017 code = PyInt_AS_LONG(py_code);
2018 if (code <= 0 || code > 0x7fffffffL) {
2019 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
2020 "extension code %ld is out of range",
2021 "Ol", args, code);
2022 goto finally;
2023 }
2024
2025 /* Generate an EXT opcode. */
2026 if (code <= 0xff) {
2027 c_str[0] = EXT1;
2028 c_str[1] = (char)code;
2029 n = 2;
2030 }
2031 else if (code <= 0xffff) {
2032 c_str[0] = EXT2;
2033 c_str[1] = (char)(code & 0xff);
2034 c_str[2] = (char)((code >> 8) & 0xff);
2035 n = 3;
2036 }
2037 else {
2038 c_str[0] = EXT4;
2039 c_str[1] = (char)(code & 0xff);
2040 c_str[2] = (char)((code >> 8) & 0xff);
2041 c_str[3] = (char)((code >> 16) & 0xff);
2042 c_str[4] = (char)((code >> 24) & 0xff);
2043 n = 5;
2044 }
2045
2046 if (self->write_func(self, c_str, n) >= 0)
2047 res = 0;
2048 goto finally; /* and don't memoize */
2049 }
2050
2051 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00002052 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002053 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002054
Tim Peters0bc93f52003-02-02 18:29:33 +00002055 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002056 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002057
Tim Peters0bc93f52003-02-02 18:29:33 +00002058 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002059 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002060
Tim Peters0bc93f52003-02-02 18:29:33 +00002061 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002062 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002063
Tim Peters0bc93f52003-02-02 18:29:33 +00002064 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002065 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002066
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002067 if (put(self, args) < 0)
2068 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002069
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002070 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002072 finally:
2073 Py_XDECREF(module);
2074 Py_XDECREF(global_name);
2075 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002076
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002077 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002078}
2079
Guido van Rossum60456fd1997-04-09 17:36:32 +00002080static int
Tim Peterscba30e22003-02-01 06:24:36 +00002081save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002082{
2083 PyObject *pid = 0;
2084 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002085
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002086 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002087
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002088 Py_INCREF(args);
2089 ARG_TUP(self, args);
2090 if (self->arg) {
2091 pid = PyObject_Call(f, self->arg, NULL);
2092 FREE_ARG_TUP(self);
2093 }
2094 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002095
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002096 if (pid != Py_None) {
2097 if (!self->bin) {
2098 if (!PyString_Check(pid)) {
2099 PyErr_SetString(PicklingError,
2100 "persistent id must be string");
2101 goto finally;
2102 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002103
Tim Peters0bc93f52003-02-02 18:29:33 +00002104 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002105 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002107 if ((size = PyString_Size(pid)) < 0)
2108 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002109
Tim Peters0bc93f52003-02-02 18:29:33 +00002110 if (self->write_func(self,
2111 PyString_AS_STRING(
2112 (PyStringObject *)pid),
2113 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002114 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002115
Tim Peters0bc93f52003-02-02 18:29:33 +00002116 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002117 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002119 res = 1;
2120 goto finally;
2121 }
2122 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00002123 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002124 res = -1;
2125 else
2126 res = 1;
2127 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002129 goto finally;
2130 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002132 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002133
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002134 finally:
2135 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002136
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002137 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002138}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002139
Tim Peters71fcda52003-02-14 23:05:28 +00002140/* We're saving ob, and args is the 2-thru-5 tuple returned by the
2141 * appropriate __reduce__ method for ob.
2142 */
Tim Peters84e87f32001-03-17 04:50:51 +00002143static int
Amaury Forgeot d'Arc3b335ff2008-10-30 21:40:05 +00002144save_reduce(Picklerobject *self, PyObject *args, PyObject *fn, 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;
Amaury Forgeot d'Arc3b335ff2008-10-30 21:40:05 +00002148 PyObject *state = NULL;
2149 PyObject *listitems = Py_None;
2150 PyObject *dictitems = Py_None;
2151 Py_ssize_t size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002152
Tim Peters71fcda52003-02-14 23:05:28 +00002153 int use_newobj = self->proto >= 2;
2154
2155 static char reduce = REDUCE;
2156 static char build = BUILD;
2157 static char newobj = NEWOBJ;
2158
Amaury Forgeot d'Arc3b335ff2008-10-30 21:40:05 +00002159 size = PyTuple_Size(args);
2160 if (size < 2 || size > 5) {
2161 cPickle_ErrFormat(PicklingError, "tuple returned by "
2162 "%s must contain 2 through 5 elements",
2163 "O", fn);
2164 return -1;
2165 }
2166
Tim Peters71fcda52003-02-14 23:05:28 +00002167 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
2168 &callable,
2169 &argtup,
2170 &state,
2171 &listitems,
2172 &dictitems))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002173 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002174
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002175 if (!PyTuple_Check(argtup)) {
Amaury Forgeot d'Arc3b335ff2008-10-30 21:40:05 +00002176 cPickle_ErrFormat(PicklingError, "Second element of "
2177 "tuple returned by %s must be a tuple",
2178 "O", fn);
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002179 return -1;
2180 }
2181
Tim Peters71fcda52003-02-14 23:05:28 +00002182 if (state == Py_None)
2183 state = NULL;
Amaury Forgeot d'Arc3b335ff2008-10-30 21:40:05 +00002184
Tim Peters71fcda52003-02-14 23:05:28 +00002185 if (listitems == Py_None)
2186 listitems = NULL;
Amaury Forgeot d'Arc3b335ff2008-10-30 21:40:05 +00002187 else if (!PyIter_Check(listitems)) {
2188 cPickle_ErrFormat(PicklingError, "Fourth element of "
2189 "tuple returned by %s must be an iterator, not %s",
2190 "Os", fn, listitems->ob_type->tp_name);
2191 return -1;
2192 }
2193
Tim Peters71fcda52003-02-14 23:05:28 +00002194 if (dictitems == Py_None)
2195 dictitems = NULL;
Amaury Forgeot d'Arc3b335ff2008-10-30 21:40:05 +00002196 else if (!PyIter_Check(dictitems)) {
2197 cPickle_ErrFormat(PicklingError, "Fifth element of "
2198 "tuple returned by %s must be an iterator, not %s",
2199 "Os", fn, dictitems->ob_type->tp_name);
2200 return -1;
2201 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002202
Tim Peters71fcda52003-02-14 23:05:28 +00002203 /* Protocol 2 special case: if callable's name is __newobj__, use
2204 * NEWOBJ. This consumes a lot of code.
2205 */
2206 if (use_newobj) {
2207 PyObject *temp = PyObject_GetAttr(callable, __name___str);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002208
Tim Peters71fcda52003-02-14 23:05:28 +00002209 if (temp == NULL) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002210 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2211 PyErr_Clear();
2212 else
2213 return -1;
Tim Peters71fcda52003-02-14 23:05:28 +00002214 use_newobj = 0;
2215 }
2216 else {
2217 use_newobj = PyString_Check(temp) &&
2218 strcmp(PyString_AS_STRING(temp),
2219 "__newobj__") == 0;
2220 Py_DECREF(temp);
2221 }
2222 }
2223 if (use_newobj) {
2224 PyObject *cls;
2225 PyObject *newargtup;
2226 int n, i;
2227
2228 /* Sanity checks. */
2229 n = PyTuple_Size(argtup);
2230 if (n < 1) {
2231 PyErr_SetString(PicklingError, "__newobj__ arglist "
2232 "is empty");
2233 return -1;
2234 }
2235
2236 cls = PyTuple_GET_ITEM(argtup, 0);
2237 if (! PyObject_HasAttrString(cls, "__new__")) {
2238 PyErr_SetString(PicklingError, "args[0] from "
2239 "__newobj__ args has no __new__");
2240 return -1;
2241 }
2242
2243 /* XXX How could ob be NULL? */
2244 if (ob != NULL) {
2245 PyObject *ob_dot_class;
2246
2247 ob_dot_class = PyObject_GetAttr(ob, __class___str);
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002248 if (ob_dot_class == NULL) {
2249 if (PyErr_ExceptionMatches(
2250 PyExc_AttributeError))
2251 PyErr_Clear();
2252 else
2253 return -1;
2254 }
Tim Peters71fcda52003-02-14 23:05:28 +00002255 i = ob_dot_class != cls; /* true iff a problem */
2256 Py_XDECREF(ob_dot_class);
2257 if (i) {
2258 PyErr_SetString(PicklingError, "args[0] from "
2259 "__newobj__ args has the wrong class");
2260 return -1;
2261 }
2262 }
2263
2264 /* Save the class and its __new__ arguments. */
2265 if (save(self, cls, 0) < 0)
2266 return -1;
2267
2268 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2269 if (newargtup == NULL)
2270 return -1;
2271 for (i = 1; i < n; ++i) {
2272 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2273 Py_INCREF(temp);
2274 PyTuple_SET_ITEM(newargtup, i-1, temp);
2275 }
Neal Norwitzc9f22b92007-10-05 05:05:24 +00002276 i = save(self, newargtup, 0);
Tim Peters71fcda52003-02-14 23:05:28 +00002277 Py_DECREF(newargtup);
2278 if (i < 0)
2279 return -1;
2280
2281 /* Add NEWOBJ opcode. */
2282 if (self->write_func(self, &newobj, 1) < 0)
2283 return -1;
2284 }
2285 else {
2286 /* Not using NEWOBJ. */
2287 if (save(self, callable, 0) < 0 ||
2288 save(self, argtup, 0) < 0 ||
2289 self->write_func(self, &reduce, 1) < 0)
2290 return -1;
2291 }
2292
2293 /* Memoize. */
2294 /* XXX How can ob be NULL? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002295 if (ob != NULL) {
2296 if (state && !PyDict_Check(state)) {
2297 if (put2(self, ob) < 0)
2298 return -1;
2299 }
Tim Peters71fcda52003-02-14 23:05:28 +00002300 else if (put(self, ob) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002301 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002302 }
Tim Peters84e87f32001-03-17 04:50:51 +00002303
Guido van Rossum60456fd1997-04-09 17:36:32 +00002304
Tim Peters71fcda52003-02-14 23:05:28 +00002305 if (listitems && batch_list(self, listitems) < 0)
2306 return -1;
2307
2308 if (dictitems && batch_dict(self, dictitems) < 0)
2309 return -1;
2310
2311 if (state) {
2312 if (save(self, state, 0) < 0 ||
2313 self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002314 return -1;
2315 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002316
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002317 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002318}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002319
Guido van Rossum60456fd1997-04-09 17:36:32 +00002320static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002321save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002322{
2323 PyTypeObject *type;
Tim Peters71fcda52003-02-14 23:05:28 +00002324 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
Tim Peters71fcda52003-02-14 23:05:28 +00002325 int res = -1;
Amaury Forgeot d'Arc3b335ff2008-10-30 21:40:05 +00002326 int tmp;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002327
Martin v. Löwis5a395302002-08-04 08:20:23 +00002328 if (self->nesting++ > Py_GetRecursionLimit()){
2329 PyErr_SetString(PyExc_RuntimeError,
2330 "maximum recursion depth exceeded");
2331 goto finally;
2332 }
2333
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002334 if (!pers_save && self->pers_func) {
2335 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2336 res = tmp;
2337 goto finally;
2338 }
2339 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002341 if (args == Py_None) {
2342 res = save_none(self, args);
2343 goto finally;
2344 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002345
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002346 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002347
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002348 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002349 case 'b':
2350 if (args == Py_False || args == Py_True) {
2351 res = save_bool(self, args);
2352 goto finally;
2353 }
2354 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002355 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002356 if (type == &PyInt_Type) {
2357 res = save_int(self, args);
2358 goto finally;
2359 }
2360 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002361
Guido van Rossum60456fd1997-04-09 17:36:32 +00002362 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002363 if (type == &PyLong_Type) {
2364 res = save_long(self, args);
2365 goto finally;
2366 }
2367 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002368
Guido van Rossum60456fd1997-04-09 17:36:32 +00002369 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002370 if (type == &PyFloat_Type) {
2371 res = save_float(self, args);
2372 goto finally;
2373 }
2374 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002375
Guido van Rossum60456fd1997-04-09 17:36:32 +00002376 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002377 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2378 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002379 goto finally;
2380 }
2381 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002382
Guido van Rossum60456fd1997-04-09 17:36:32 +00002383 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002384 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2385 res = save_string(self, args, 0);
2386 goto finally;
2387 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002388
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002389#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002390 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002391 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2392 res = save_unicode(self, args, 0);
2393 goto finally;
2394 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002395#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002396 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002398 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002399 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002400 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002402 if (PyDict_GetItem(self->memo, py_ob_id)) {
2403 if (get(self, py_ob_id) < 0)
2404 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002406 res = 0;
2407 goto finally;
2408 }
2409 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002411 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002412 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002413 if (type == &PyString_Type) {
2414 res = save_string(self, args, 1);
2415 goto finally;
2416 }
2417 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002418
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002419#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002420 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002421 if (type == &PyUnicode_Type) {
2422 res = save_unicode(self, args, 1);
2423 goto finally;
2424 }
2425 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002426#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002427
Guido van Rossum60456fd1997-04-09 17:36:32 +00002428 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002429 if (type == &PyTuple_Type) {
2430 res = save_tuple(self, args);
2431 goto finally;
2432 }
2433 if (type == &PyType_Type) {
2434 res = save_global(self, args, NULL);
2435 goto finally;
2436 }
2437 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002438
Guido van Rossum60456fd1997-04-09 17:36:32 +00002439 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002440 if (type == &PyList_Type) {
2441 res = save_list(self, args);
2442 goto finally;
2443 }
2444 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002445
2446 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002447 if (type == &PyDict_Type) {
2448 res = save_dict(self, args);
2449 goto finally;
2450 }
2451 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002452
2453 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002454 if (type == &PyInstance_Type) {
2455 res = save_inst(self, args);
2456 goto finally;
2457 }
2458 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002459
2460 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002461 if (type == &PyClass_Type) {
2462 res = save_global(self, args, NULL);
2463 goto finally;
2464 }
2465 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002466
2467 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002468 if (type == &PyFunction_Type) {
2469 res = save_global(self, args, NULL);
Christian Tismer2460c622004-02-26 16:21:45 +00002470 if (res && PyErr_ExceptionMatches(PickleError)) {
2471 /* fall back to reduce */
2472 PyErr_Clear();
2473 break;
2474 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002475 goto finally;
2476 }
2477 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002478
2479 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002480 if (type == &PyCFunction_Type) {
2481 res = save_global(self, args, NULL);
2482 goto finally;
2483 }
2484 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002485
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002486 if (!pers_save && self->inst_pers_func) {
2487 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2488 res = tmp;
2489 goto finally;
2490 }
2491 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002492
Jeremy Hylton39c61162002-07-16 19:47:43 +00002493 if (PyType_IsSubtype(type, &PyType_Type)) {
2494 res = save_global(self, args, NULL);
2495 goto finally;
2496 }
2497
Guido van Rossumb289b872003-02-19 01:45:13 +00002498 /* Get a reduction callable, and call it. This may come from
2499 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
2500 * or the object's __reduce__ method.
Tim Peters71fcda52003-02-14 23:05:28 +00002501 */
Tim Peters5aa3da62003-02-13 21:03:57 +00002502 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2503 if (__reduce__ != NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002504 Py_INCREF(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00002505 Py_INCREF(args);
2506 ARG_TUP(self, args);
2507 if (self->arg) {
2508 t = PyObject_Call(__reduce__, self->arg, NULL);
2509 FREE_ARG_TUP(self);
2510 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002511 }
2512 else {
Guido van Rossumb289b872003-02-19 01:45:13 +00002513 /* Check for a __reduce_ex__ method. */
2514 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2515 if (__reduce__ != NULL) {
2516 t = PyInt_FromLong(self->proto);
2517 if (t != NULL) {
2518 ARG_TUP(self, t);
2519 t = NULL;
2520 if (self->arg) {
2521 t = PyObject_Call(__reduce__,
2522 self->arg, NULL);
2523 FREE_ARG_TUP(self);
2524 }
2525 }
2526 }
2527 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002528 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2529 PyErr_Clear();
2530 else
2531 goto finally;
Guido van Rossumb289b872003-02-19 01:45:13 +00002532 /* Check for a __reduce__ method. */
2533 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2534 if (__reduce__ != NULL) {
2535 t = PyObject_Call(__reduce__,
2536 empty_tuple, NULL);
2537 }
2538 else {
2539 PyErr_SetObject(UnpickleableError, args);
2540 goto finally;
2541 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002542 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002543 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002544
Tim Peters71fcda52003-02-14 23:05:28 +00002545 if (t == NULL)
2546 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002547
Tim Peters71fcda52003-02-14 23:05:28 +00002548 if (PyString_Check(t)) {
2549 res = save_global(self, args, t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002550 goto finally;
2551 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002552
Amaury Forgeot d'Arc3b335ff2008-10-30 21:40:05 +00002553 if (!PyTuple_Check(t)) {
Tim Peters71fcda52003-02-14 23:05:28 +00002554 cPickle_ErrFormat(PicklingError, "Value returned by "
2555 "%s must be string or tuple",
2556 "O", __reduce__);
2557 goto finally;
2558 }
2559
Amaury Forgeot d'Arc3b335ff2008-10-30 21:40:05 +00002560 res = save_reduce(self, t, __reduce__, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002562 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002563 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002564 Py_XDECREF(py_ob_id);
2565 Py_XDECREF(__reduce__);
2566 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002567
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002568 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002569}
2570
2571
2572static int
Tim Peterscba30e22003-02-01 06:24:36 +00002573dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002574{
2575 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002576
Tim Peters4190fb82003-02-02 16:09:05 +00002577 if (self->proto >= 2) {
2578 char bytes[2];
2579
2580 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002581 assert(self->proto >= 0 && self->proto < 256);
2582 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002583 if (self->write_func(self, bytes, 2) < 0)
2584 return -1;
2585 }
2586
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002587 if (save(self, args, 0) < 0)
2588 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002589
Tim Peters4190fb82003-02-02 16:09:05 +00002590 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002591 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002592
Tim Peters4190fb82003-02-02 16:09:05 +00002593 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002594 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002596 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002597}
2598
2599static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002600Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002601{
Tim Peterscba30e22003-02-01 06:24:36 +00002602 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002603 PyDict_Clear(self->memo);
2604 Py_INCREF(Py_None);
2605 return Py_None;
2606}
2607
2608static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002609Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002610{
2611 int l, i, rsize, ssize, clear=1, lm;
2612 long ik;
2613 PyObject *k, *r;
2614 char *s, *p, *have_get;
2615 Pdata *data;
2616
2617 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002618 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002619 return NULL;
2620
2621 /* Check to make sure we are based on a list */
2622 if (! Pdata_Check(self->file)) {
2623 PyErr_SetString(PicklingError,
2624 "Attempt to getvalue() a non-list-based pickler");
2625 return NULL;
2626 }
2627
2628 /* flush write buffer */
2629 if (write_other(self, NULL, 0) < 0) return NULL;
2630
2631 data=(Pdata*)self->file;
2632 l=data->length;
2633
2634 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002635 lm = PyDict_Size(self->memo);
2636 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002637 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002638 have_get = malloc(lm);
2639 if (have_get == NULL) return PyErr_NoMemory();
2640 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002641
2642 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002643 for (rsize = 0, i = l; --i >= 0; ) {
2644 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002645
Tim Petersac5687a2003-02-02 18:08:34 +00002646 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002647 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002648
2649 else if (PyInt_Check(k)) { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002650 ik = PyInt_AS_LONG((PyIntObject*)k);
2651 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002652 PyErr_SetString(PicklingError,
2653 "Invalid get data");
Neal Norwitz98a96002006-07-23 07:57:11 +00002654 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002655 }
Tim Petersac5687a2003-02-02 18:08:34 +00002656 if (have_get[ik]) /* with matching get */
2657 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002658 }
2659
2660 else if (! (PyTuple_Check(k) &&
2661 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002662 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002663 ) {
2664 PyErr_SetString(PicklingError,
2665 "Unexpected data in internal list");
Neal Norwitz98a96002006-07-23 07:57:11 +00002666 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002667 }
2668
2669 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002670 ik = PyInt_AS_LONG((PyIntObject *)k);
2671 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002672 PyErr_SetString(PicklingError,
2673 "Invalid get data");
2674 return NULL;
2675 }
Tim Petersac5687a2003-02-02 18:08:34 +00002676 have_get[ik] = 1;
2677 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002678 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002679 }
2680
2681 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002682 r = PyString_FromStringAndSize(NULL, rsize);
2683 if (r == NULL) goto err;
2684 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002685
Tim Petersac5687a2003-02-02 18:08:34 +00002686 for (i = 0; i < l; i++) {
2687 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002688
2689 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002690 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002691 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002692 p=PyString_AS_STRING((PyStringObject *)k);
2693 while (--ssize >= 0)
2694 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002695 }
2696 }
2697
2698 else if (PyTuple_Check(k)) { /* get */
Tim Petersac5687a2003-02-02 18:08:34 +00002699 ik = PyInt_AS_LONG((PyIntObject *)
2700 PyTuple_GET_ITEM(k, 0));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002701 if (ik < 256) {
2702 *s++ = BINGET;
2703 *s++ = (int)(ik & 0xff);
2704 }
2705 else {
2706 *s++ = LONG_BINGET;
2707 *s++ = (int)(ik & 0xff);
2708 *s++ = (int)((ik >> 8) & 0xff);
2709 *s++ = (int)((ik >> 16) & 0xff);
2710 *s++ = (int)((ik >> 24) & 0xff);
2711 }
2712 }
2713
2714 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002715 ik = PyInt_AS_LONG((PyIntObject*)k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002716
2717 if (have_get[ik]) { /* with matching get */
2718 if (ik < 256) {
2719 *s++ = BINPUT;
2720 *s++ = (int)(ik & 0xff);
2721 }
2722 else {
2723 *s++ = LONG_BINPUT;
2724 *s++ = (int)(ik & 0xff);
2725 *s++ = (int)((ik >> 8) & 0xff);
2726 *s++ = (int)((ik >> 16) & 0xff);
2727 *s++ = (int)((ik >> 24) & 0xff);
2728 }
2729 }
2730 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002731 }
2732
2733 if (clear) {
2734 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002735 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002736 }
2737
2738 free(have_get);
2739 return r;
2740 err:
2741 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002742 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002743}
2744
2745static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002746Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002747{
2748 PyObject *ob;
2749 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002750
Tim Peterscba30e22003-02-01 06:24:36 +00002751 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002752 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002754 if (dump(self, ob) < 0)
2755 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002757 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002759 /* XXX Why does dump() return self? */
2760 Py_INCREF(self);
2761 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002762}
2763
2764
Tim Peterscba30e22003-02-01 06:24:36 +00002765static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002766{
Neal Norwitzb0493252002-03-31 14:44:22 +00002767 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002768 PyDoc_STR("dump(object) -- "
2769 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002770 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002771 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002772 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002773 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002774 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002775};
2776
2777
2778static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002779newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002780{
2781 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002782
Tim Peters5bd2a792003-02-01 16:45:06 +00002783 if (proto < 0)
Tim Peters8587b3c2003-02-13 15:44:41 +00002784 proto = HIGHEST_PROTOCOL;
2785 if (proto > HIGHEST_PROTOCOL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002786 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2787 "the highest available protocol is %d",
Tim Peters8587b3c2003-02-13 15:44:41 +00002788 proto, HIGHEST_PROTOCOL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002789 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002790 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002791
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002792 self = PyObject_GC_New(Picklerobject, &Picklertype);
Tim Peters5bd2a792003-02-01 16:45:06 +00002793 if (self == NULL)
2794 return NULL;
2795 self->proto = proto;
2796 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002797 self->fp = NULL;
2798 self->write = NULL;
2799 self->memo = NULL;
2800 self->arg = NULL;
2801 self->pers_func = NULL;
2802 self->inst_pers_func = NULL;
2803 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002804 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002805 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002806 self->fast_container = 0;
2807 self->fast_memo = NULL;
2808 self->buf_size = 0;
2809 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002810
Tim Peters5bd2a792003-02-01 16:45:06 +00002811 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002812 if (file)
2813 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002814 else {
2815 file = Pdata_New();
2816 if (file == NULL)
2817 goto err;
2818 }
2819 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002820
Tim Peterscba30e22003-02-01 06:24:36 +00002821 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002822 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002824 if (PyFile_Check(file)) {
2825 self->fp = PyFile_AsFile(file);
2826 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002827 PyErr_SetString(PyExc_ValueError,
2828 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002829 goto err;
2830 }
2831 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002832 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002833 else if (PycStringIO_OutputCheck(file)) {
2834 self->write_func = write_cStringIO;
2835 }
2836 else if (file == Py_None) {
2837 self->write_func = write_none;
2838 }
2839 else {
2840 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002841
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002842 if (! Pdata_Check(file)) {
2843 self->write = PyObject_GetAttr(file, write_str);
2844 if (!self->write) {
2845 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002846 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002847 "argument must have 'write' "
2848 "attribute");
2849 goto err;
2850 }
2851 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002852
Tim Peters5bd2a792003-02-01 16:45:06 +00002853 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2854 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002855 PyErr_NoMemory();
2856 goto err;
2857 }
2858 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002860 if (PyEval_GetRestricted()) {
2861 /* Restricted execution, get private tables */
Tim Peters5b7da392003-02-04 00:21:07 +00002862 PyObject *m = PyImport_Import(copy_reg_str);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002863
Tim Peters5b7da392003-02-04 00:21:07 +00002864 if (m == NULL)
2865 goto err;
2866 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002867 Py_DECREF(m);
Tim Peters5b7da392003-02-04 00:21:07 +00002868 if (self->dispatch_table == NULL)
2869 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002870 }
2871 else {
Tim Peters5b7da392003-02-04 00:21:07 +00002872 self->dispatch_table = dispatch_table;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002873 Py_INCREF(dispatch_table);
2874 }
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002875 PyObject_GC_Track(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002876
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002877 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002879 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002880 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002881 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002882}
2883
2884
2885static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00002886get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002887{
Martin v. Löwis15e62742006-02-27 16:46:16 +00002888 static char *kwlist[] = {"file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002889 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002890 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002891
Tim Peters92c8bb32003-02-13 23:00:26 +00002892 /* XXX
Martin v. Löwis544f1192004-07-27 05:22:33 +00002893 * The documented signature is Pickler(file, protocol=0), but this
Tim Peters92c8bb32003-02-13 23:00:26 +00002894 * accepts Pickler() and Pickler(integer) too. The meaning then
2895 * is clear as mud, undocumented, and not supported by pickle.py.
2896 * I'm told Zope uses this, but I haven't traced into this code
2897 * far enough to figure out what it means.
Tim Peters5bd2a792003-02-01 16:45:06 +00002898 */
2899 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002900 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002901 proto = 0;
Martin v. Löwis544f1192004-07-27 05:22:33 +00002902 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
2903 kwlist, &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002904 return NULL;
2905 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002906 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002907}
2908
2909
2910static void
Tim Peterscba30e22003-02-01 06:24:36 +00002911Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002912{
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002913 PyObject_GC_UnTrack(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002914 Py_XDECREF(self->write);
2915 Py_XDECREF(self->memo);
2916 Py_XDECREF(self->fast_memo);
2917 Py_XDECREF(self->arg);
2918 Py_XDECREF(self->file);
2919 Py_XDECREF(self->pers_func);
2920 Py_XDECREF(self->inst_pers_func);
2921 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002922 PyMem_Free(self->write_buf);
Tim Peters3cfe7542003-05-21 21:29:48 +00002923 self->ob_type->tp_free((PyObject *)self);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002924}
2925
2926static int
2927Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
2928{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002929 Py_VISIT(self->write);
2930 Py_VISIT(self->memo);
2931 Py_VISIT(self->fast_memo);
2932 Py_VISIT(self->arg);
2933 Py_VISIT(self->file);
2934 Py_VISIT(self->pers_func);
2935 Py_VISIT(self->inst_pers_func);
2936 Py_VISIT(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002937 return 0;
2938}
2939
2940static int
2941Pickler_clear(Picklerobject *self)
2942{
Thomas Woutersedf17d82006-04-15 17:28:34 +00002943 Py_CLEAR(self->write);
2944 Py_CLEAR(self->memo);
2945 Py_CLEAR(self->fast_memo);
2946 Py_CLEAR(self->arg);
2947 Py_CLEAR(self->file);
2948 Py_CLEAR(self->pers_func);
2949 Py_CLEAR(self->inst_pers_func);
2950 Py_CLEAR(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002951 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002952}
2953
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002954static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002955Pickler_get_pers_func(Picklerobject *p)
2956{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002957 if (p->pers_func == NULL)
2958 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2959 else
2960 Py_INCREF(p->pers_func);
2961 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002962}
2963
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002964static int
2965Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2966{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002967 if (v == NULL) {
2968 PyErr_SetString(PyExc_TypeError,
2969 "attribute deletion is not supported");
2970 return -1;
2971 }
2972 Py_XDECREF(p->pers_func);
2973 Py_INCREF(v);
2974 p->pers_func = v;
2975 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002976}
2977
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002978static int
2979Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2980{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002981 if (v == NULL) {
2982 PyErr_SetString(PyExc_TypeError,
2983 "attribute deletion is not supported");
2984 return -1;
2985 }
2986 Py_XDECREF(p->inst_pers_func);
2987 Py_INCREF(v);
2988 p->inst_pers_func = v;
2989 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002990}
2991
2992static PyObject *
2993Pickler_get_memo(Picklerobject *p)
2994{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002995 if (p->memo == NULL)
2996 PyErr_SetString(PyExc_AttributeError, "memo");
2997 else
2998 Py_INCREF(p->memo);
2999 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003000}
3001
3002static int
3003Pickler_set_memo(Picklerobject *p, PyObject *v)
3004{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003005 if (v == NULL) {
3006 PyErr_SetString(PyExc_TypeError,
3007 "attribute deletion is not supported");
3008 return -1;
3009 }
3010 if (!PyDict_Check(v)) {
3011 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
3012 return -1;
3013 }
3014 Py_XDECREF(p->memo);
3015 Py_INCREF(v);
3016 p->memo = v;
3017 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003018}
3019
3020static PyObject *
3021Pickler_get_error(Picklerobject *p)
3022{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003023 /* why is this an attribute on the Pickler? */
3024 Py_INCREF(PicklingError);
3025 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003026}
3027
3028static PyMemberDef Pickler_members[] = {
3029 {"binary", T_INT, offsetof(Picklerobject, bin)},
3030 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00003031 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003032};
3033
3034static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00003035 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003036 (setter)Pickler_set_pers_func},
3037 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
3038 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00003039 {"PicklingError", (getter)Pickler_get_error, NULL},
3040 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003041};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003042
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003043PyDoc_STRVAR(Picklertype__doc__,
3044"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003045
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003046static PyTypeObject Picklertype = {
3047 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00003048 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00003049 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003050 sizeof(Picklerobject), /*tp_basicsize*/
3051 0,
3052 (destructor)Pickler_dealloc, /* tp_dealloc */
3053 0, /* tp_print */
3054 0, /* tp_getattr */
3055 0, /* tp_setattr */
3056 0, /* tp_compare */
3057 0, /* tp_repr */
3058 0, /* tp_as_number */
3059 0, /* tp_as_sequence */
3060 0, /* tp_as_mapping */
3061 0, /* tp_hash */
3062 0, /* tp_call */
3063 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00003064 PyObject_GenericGetAttr, /* tp_getattro */
3065 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003066 0, /* tp_as_buffer */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003067 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003068 Picklertype__doc__, /* tp_doc */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003069 (traverseproc)Pickler_traverse, /* tp_traverse */
3070 (inquiry)Pickler_clear, /* tp_clear */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003071 0, /* tp_richcompare */
3072 0, /* tp_weaklistoffset */
3073 0, /* tp_iter */
3074 0, /* tp_iternext */
3075 Pickler_methods, /* tp_methods */
3076 Pickler_members, /* tp_members */
3077 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003078};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003079
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003080static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003081find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003082{
3083 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003085 if (fc) {
3086 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00003087 PyErr_SetString(UnpicklingError, "Global and instance "
3088 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003089 return NULL;
3090 }
Georg Brandl684fd0c2006-05-25 19:15:31 +00003091 return PyObject_CallFunctionObjArgs(fc, py_module_name,
3092 py_global_name, NULL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003093 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00003094
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003095 module = PySys_GetObject("modules");
3096 if (module == NULL)
3097 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00003098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003099 module = PyDict_GetItem(module, py_module_name);
3100 if (module == NULL) {
3101 module = PyImport_Import(py_module_name);
3102 if (!module)
3103 return NULL;
3104 global = PyObject_GetAttr(module, py_global_name);
3105 Py_DECREF(module);
3106 }
3107 else
3108 global = PyObject_GetAttr(module, py_global_name);
3109 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003110}
3111
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003112static int
Tim Peterscba30e22003-02-01 06:24:36 +00003113marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003114{
3115 if (self->num_marks < 1) {
3116 PyErr_SetString(UnpicklingError, "could not find MARK");
3117 return -1;
3118 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003119
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003120 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003121}
3122
Tim Peters84e87f32001-03-17 04:50:51 +00003123
Guido van Rossum60456fd1997-04-09 17:36:32 +00003124static int
Tim Peterscba30e22003-02-01 06:24:36 +00003125load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003126{
3127 PDATA_APPEND(self->stack, Py_None, -1);
3128 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003129}
3130
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003131static int
Tim Peterscba30e22003-02-01 06:24:36 +00003132bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003133{
3134 PyErr_SetString(UnpicklingError, "pickle data was truncated");
3135 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003136}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003137
3138static int
Tim Peterscba30e22003-02-01 06:24:36 +00003139load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003140{
3141 PyObject *py_int = 0;
3142 char *endptr, *s;
3143 int len, res = -1;
3144 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003145
Tim Peters0bc93f52003-02-02 18:29:33 +00003146 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003147 if (len < 2) return bad_readline();
3148 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003149
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003150 errno = 0;
3151 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003153 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
3154 /* Hm, maybe we've got something long. Let's try reading
3155 it as a Python long object. */
3156 errno = 0;
3157 py_int = PyLong_FromString(s, NULL, 0);
3158 if (py_int == NULL) {
3159 PyErr_SetString(PyExc_ValueError,
3160 "could not convert string to int");
3161 goto finally;
3162 }
3163 }
3164 else {
Guido van Rossume2763392002-04-05 19:30:08 +00003165 if (len == 3 && (l == 0 || l == 1)) {
3166 if (!( py_int = PyBool_FromLong(l))) goto finally;
3167 }
3168 else {
3169 if (!( py_int = PyInt_FromLong(l))) goto finally;
3170 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003171 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003173 free(s);
3174 PDATA_PUSH(self->stack, py_int, -1);
3175 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003176
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003177 finally:
3178 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003180 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003181}
3182
Tim Peters3c67d792003-02-02 17:59:11 +00003183static int
3184load_bool(Unpicklerobject *self, PyObject *boolean)
3185{
3186 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00003187 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00003188 return 0;
3189}
3190
Tim Petersee1a53c2003-02-02 02:57:53 +00003191/* s contains x bytes of a little-endian integer. Return its value as a
3192 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3193 * int, but when x is 4 it's a signed one. This is an historical source
3194 * of x-platform bugs.
3195 */
Tim Peters84e87f32001-03-17 04:50:51 +00003196static long
Tim Petersee1a53c2003-02-02 02:57:53 +00003197calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003198{
3199 unsigned char c;
3200 int i;
3201 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003203 for (i = 0, l = 0L; i < x; i++) {
3204 c = (unsigned char)s[i];
3205 l |= (long)c << (i * 8);
3206 }
Tim Petersbfa18f72001-04-10 01:54:42 +00003207#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003208 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3209 * is signed, so on a box with longs bigger than 4 bytes we need
3210 * to extend a BININT's sign bit to the full width.
3211 */
3212 if (x == 4 && l & (1L << 31))
3213 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00003214#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003215 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003216}
3217
3218
3219static int
Tim Peterscba30e22003-02-01 06:24:36 +00003220load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003221{
3222 PyObject *py_int = 0;
3223 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003224
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003225 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003226
Tim Peterscba30e22003-02-01 06:24:36 +00003227 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003228 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003229
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003230 PDATA_PUSH(self->stack, py_int, -1);
3231 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003232}
3233
3234
3235static int
Tim Peterscba30e22003-02-01 06:24:36 +00003236load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003237{
3238 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003239
Tim Peters0bc93f52003-02-02 18:29:33 +00003240 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003241 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003243 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003244}
3245
3246
3247static int
Tim Peterscba30e22003-02-01 06:24:36 +00003248load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003249{
3250 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003251
Tim Peters0bc93f52003-02-02 18:29:33 +00003252 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003253 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003254
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003255 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003256}
3257
3258
3259static int
Tim Peterscba30e22003-02-01 06:24:36 +00003260load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003261{
3262 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003263
Tim Peters0bc93f52003-02-02 18:29:33 +00003264 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003265 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003266
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003267 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003268}
Tim Peters84e87f32001-03-17 04:50:51 +00003269
Guido van Rossum60456fd1997-04-09 17:36:32 +00003270static int
Tim Peterscba30e22003-02-01 06:24:36 +00003271load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003272{
3273 PyObject *l = 0;
3274 char *end, *s;
3275 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003276
Tim Peters0bc93f52003-02-02 18:29:33 +00003277 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003278 if (len < 2) return bad_readline();
3279 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003280
Tim Peterscba30e22003-02-01 06:24:36 +00003281 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003282 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003283
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003284 free(s);
3285 PDATA_PUSH(self->stack, l, -1);
3286 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003288 finally:
3289 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003291 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003292}
3293
Tim Petersee1a53c2003-02-02 02:57:53 +00003294/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3295 * data following.
3296 */
3297static int
3298load_counted_long(Unpicklerobject *self, int size)
3299{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003300 Py_ssize_t i;
Tim Petersee1a53c2003-02-02 02:57:53 +00003301 char *nbytes;
3302 unsigned char *pdata;
3303 PyObject *along;
3304
3305 assert(size == 1 || size == 4);
3306 i = self->read_func(self, &nbytes, size);
3307 if (i < 0) return -1;
3308
3309 size = calc_binint(nbytes, size);
3310 if (size < 0) {
3311 /* Corrupt or hostile pickle -- we never write one like
3312 * this.
3313 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003314 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003315 "byte count");
3316 return -1;
3317 }
3318
3319 if (size == 0)
3320 along = PyLong_FromLong(0L);
3321 else {
3322 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003323 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003324 if (i < 0) return -1;
3325 along = _PyLong_FromByteArray(pdata, (size_t)size,
3326 1 /* little endian */, 1 /* signed */);
3327 }
3328 if (along == NULL)
3329 return -1;
3330 PDATA_PUSH(self->stack, along, -1);
3331 return 0;
3332}
Tim Peters84e87f32001-03-17 04:50:51 +00003333
Guido van Rossum60456fd1997-04-09 17:36:32 +00003334static int
Tim Peterscba30e22003-02-01 06:24:36 +00003335load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003336{
3337 PyObject *py_float = 0;
3338 char *endptr, *s;
3339 int len, res = -1;
3340 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003341
Tim Peters0bc93f52003-02-02 18:29:33 +00003342 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003343 if (len < 2) return bad_readline();
3344 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003345
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003346 errno = 0;
Martin v. Löwis737ea822004-06-08 18:52:54 +00003347 d = PyOS_ascii_strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003349 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3350 PyErr_SetString(PyExc_ValueError,
3351 "could not convert string to float");
3352 goto finally;
3353 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003354
Tim Peterscba30e22003-02-01 06:24:36 +00003355 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003356 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003357
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003358 free(s);
3359 PDATA_PUSH(self->stack, py_float, -1);
3360 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003362 finally:
3363 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003364
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003365 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003366}
3367
Guido van Rossum60456fd1997-04-09 17:36:32 +00003368static int
Tim Peterscba30e22003-02-01 06:24:36 +00003369load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003370{
Tim Peters9905b942003-03-20 20:53:32 +00003371 PyObject *py_float;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003372 double x;
3373 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003374
Tim Peters0bc93f52003-02-02 18:29:33 +00003375 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003376 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003377
Tim Peters9905b942003-03-20 20:53:32 +00003378 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3379 if (x == -1.0 && PyErr_Occurred())
3380 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003381
Tim Peters9905b942003-03-20 20:53:32 +00003382 py_float = PyFloat_FromDouble(x);
3383 if (py_float == NULL)
3384 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003385
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003386 PDATA_PUSH(self->stack, py_float, -1);
3387 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003388}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003389
3390static int
Tim Peterscba30e22003-02-01 06:24:36 +00003391load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003392{
3393 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003394 int len, res = -1;
3395 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003396
Tim Peters0bc93f52003-02-02 18:29:33 +00003397 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003398 if (len < 2) return bad_readline();
3399 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003400
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003401
3402 /* Strip outermost quotes */
3403 while (s[len-1] <= ' ')
3404 len--;
3405 if(s[0]=='"' && s[len-1]=='"'){
3406 s[len-1] = '\0';
3407 p = s + 1 ;
3408 len -= 2;
3409 } else if(s[0]=='\'' && s[len-1]=='\''){
3410 s[len-1] = '\0';
3411 p = s + 1 ;
3412 len -= 2;
3413 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003414 goto insecure;
3415 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003416
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003417 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
Neal Norwitz99dfe3c2006-08-02 04:27:11 +00003418 free(s);
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003419 if (str) {
3420 PDATA_PUSH(self->stack, str, -1);
3421 res = 0;
3422 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003423 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003425 insecure:
3426 free(s);
3427 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3428 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003429}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003430
3431
3432static int
Tim Peterscba30e22003-02-01 06:24:36 +00003433load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003434{
3435 PyObject *py_string = 0;
3436 long l;
3437 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003438
Tim Peters0bc93f52003-02-02 18:29:33 +00003439 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003441 l = calc_binint(s, 4);
Martin v. Löwis73c01d42008-02-14 11:26:18 +00003442 if (l < 0) {
3443 /* Corrupt or hostile pickle -- we never write one like
3444 * this.
3445 */
3446 PyErr_SetString(UnpicklingError,
3447 "BINSTRING pickle has negative byte count");
3448 return -1;
3449 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003450
Tim Peters0bc93f52003-02-02 18:29:33 +00003451 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003452 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003453
Tim Peterscba30e22003-02-01 06:24:36 +00003454 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003455 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003456
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003457 PDATA_PUSH(self->stack, py_string, -1);
3458 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003459}
3460
3461
3462static int
Tim Peterscba30e22003-02-01 06:24:36 +00003463load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003464{
3465 PyObject *py_string = 0;
3466 unsigned char l;
3467 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003468
Tim Peters0bc93f52003-02-02 18:29:33 +00003469 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003470 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003472 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003473
Tim Peters0bc93f52003-02-02 18:29:33 +00003474 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003475
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003476 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003477
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003478 PDATA_PUSH(self->stack, py_string, -1);
3479 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003480}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003481
3482
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003483#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003484static int
Tim Peterscba30e22003-02-01 06:24:36 +00003485load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003486{
3487 PyObject *str = 0;
3488 int len, res = -1;
3489 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003490
Tim Peters0bc93f52003-02-02 18:29:33 +00003491 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003492 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003493
Tim Peterscba30e22003-02-01 06:24:36 +00003494 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003495 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003496
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003497 PDATA_PUSH(self->stack, str, -1);
3498 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003499
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003500 finally:
3501 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003502}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003503#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003504
3505
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003506#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003507static int
Tim Peterscba30e22003-02-01 06:24:36 +00003508load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003509{
3510 PyObject *unicode;
3511 long l;
3512 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003513
Tim Peters0bc93f52003-02-02 18:29:33 +00003514 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003516 l = calc_binint(s, 4);
Martin v. Löwis73c01d42008-02-14 11:26:18 +00003517 if (l < 0) {
3518 /* Corrupt or hostile pickle -- we never write one like
3519 * this.
3520 */
3521 PyErr_SetString(UnpicklingError,
3522 "BINUNICODE pickle has negative byte count");
3523 return -1;
3524 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003525
Tim Peters0bc93f52003-02-02 18:29:33 +00003526 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003527 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003528
Tim Peterscba30e22003-02-01 06:24:36 +00003529 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003530 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003531
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003532 PDATA_PUSH(self->stack, unicode, -1);
3533 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003534}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003535#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003536
3537
3538static int
Tim Peterscba30e22003-02-01 06:24:36 +00003539load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003540{
3541 PyObject *tup;
3542 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003544 if ((i = marker(self)) < 0) return -1;
3545 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3546 PDATA_PUSH(self->stack, tup, -1);
3547 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003548}
3549
3550static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003551load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003552{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003553 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003554
Tim Peters1d63c9f2003-02-02 20:29:39 +00003555 if (tup == NULL)
3556 return -1;
3557
3558 while (--len >= 0) {
3559 PyObject *element;
3560
3561 PDATA_POP(self->stack, element);
3562 if (element == NULL)
3563 return -1;
3564 PyTuple_SET_ITEM(tup, len, element);
3565 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003566 PDATA_PUSH(self->stack, tup, -1);
3567 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003568}
3569
3570static int
Tim Peterscba30e22003-02-01 06:24:36 +00003571load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003572{
3573 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003575 if (!( list=PyList_New(0))) return -1;
3576 PDATA_PUSH(self->stack, list, -1);
3577 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003578}
3579
3580static int
Tim Peterscba30e22003-02-01 06:24:36 +00003581load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003582{
3583 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003584
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003585 if (!( dict=PyDict_New())) return -1;
3586 PDATA_PUSH(self->stack, dict, -1);
3587 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003588}
3589
3590
3591static int
Tim Peterscba30e22003-02-01 06:24:36 +00003592load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003593{
3594 PyObject *list = 0;
3595 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003596
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003597 if ((i = marker(self)) < 0) return -1;
3598 if (!( list=Pdata_popList(self->stack, i))) return -1;
3599 PDATA_PUSH(self->stack, list, -1);
3600 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003601}
3602
3603static int
Tim Peterscba30e22003-02-01 06:24:36 +00003604load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003605{
3606 PyObject *dict, *key, *value;
3607 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003609 if ((i = marker(self)) < 0) return -1;
3610 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003612 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003614 for (k = i+1; k < j; k += 2) {
3615 key =self->stack->data[k-1];
3616 value=self->stack->data[k ];
3617 if (PyDict_SetItem(dict, key, value) < 0) {
3618 Py_DECREF(dict);
3619 return -1;
3620 }
3621 }
3622 Pdata_clear(self->stack, i);
3623 PDATA_PUSH(self->stack, dict, -1);
3624 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003625}
3626
3627static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003628Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003629{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003630 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003631
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003632 if (PyClass_Check(cls)) {
3633 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003634
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003635 if ((l=PyObject_Size(args)) < 0) goto err;
3636 if (!( l )) {
3637 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003638
Tim Peterscba30e22003-02-01 06:24:36 +00003639 __getinitargs__ = PyObject_GetAttr(cls,
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00003640 __getinitargs___str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003641 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003642 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003643 so bypass usual construction */
3644 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003645
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003646 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003647 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003648 goto err;
3649 return inst;
3650 }
3651 Py_DECREF(__getinitargs__);
3652 }
Tim Peters84e87f32001-03-17 04:50:51 +00003653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003654 if ((r=PyInstance_New(cls, args, NULL))) return r;
3655 else goto err;
3656 }
Tim Peters84e87f32001-03-17 04:50:51 +00003657
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003658 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003659
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003660 err:
3661 {
Neal Norwitz0f8b31a2006-06-28 06:28:31 +00003662 PyObject *tp, *v, *tb, *tmp_value;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003663
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003664 PyErr_Fetch(&tp, &v, &tb);
Neal Norwitz0f8b31a2006-06-28 06:28:31 +00003665 tmp_value = v;
3666 /* NULL occurs when there was a KeyboardInterrupt */
3667 if (tmp_value == NULL)
3668 tmp_value = Py_None;
3669 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003670 Py_XDECREF(v);
3671 v=r;
3672 }
3673 PyErr_Restore(tp,v,tb);
3674 }
3675 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003676}
Tim Peters84e87f32001-03-17 04:50:51 +00003677
Guido van Rossum60456fd1997-04-09 17:36:32 +00003678
3679static int
Tim Peterscba30e22003-02-01 06:24:36 +00003680load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003681{
3682 PyObject *class, *tup, *obj=0;
3683 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003685 if ((i = marker(self)) < 0) return -1;
3686 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3687 PDATA_POP(self->stack, class);
3688 if (class) {
3689 obj = Instance_New(class, tup);
3690 Py_DECREF(class);
3691 }
3692 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003693
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003694 if (! obj) return -1;
3695 PDATA_PUSH(self->stack, obj, -1);
3696 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003697}
3698
3699
3700static int
Tim Peterscba30e22003-02-01 06:24:36 +00003701load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003702{
3703 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3704 int i, len;
3705 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003707 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003708
Tim Peters0bc93f52003-02-02 18:29:33 +00003709 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003710 if (len < 2) return bad_readline();
3711 module_name = PyString_FromStringAndSize(s, len - 1);
3712 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003713
Tim Peters0bc93f52003-02-02 18:29:33 +00003714 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003715 if (len < 2) return bad_readline();
3716 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003717 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003718 self->find_class);
3719 Py_DECREF(class_name);
3720 }
3721 }
3722 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003724 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003725
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003726 if ((tup=Pdata_popTuple(self->stack, i))) {
3727 obj = Instance_New(class, tup);
3728 Py_DECREF(tup);
3729 }
3730 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003732 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003733
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003734 PDATA_PUSH(self->stack, obj, -1);
3735 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003736}
3737
Tim Peterseab7db32003-02-13 18:24:14 +00003738static int
3739load_newobj(Unpicklerobject *self)
3740{
3741 PyObject *args = NULL;
3742 PyObject *clsraw = NULL;
3743 PyTypeObject *cls; /* clsraw cast to its true type */
3744 PyObject *obj;
3745
3746 /* Stack is ... cls argtuple, and we want to call
3747 * cls.__new__(cls, *argtuple).
3748 */
3749 PDATA_POP(self->stack, args);
3750 if (args == NULL) goto Fail;
3751 if (! PyTuple_Check(args)) {
3752 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3753 "tuple.");
3754 goto Fail;
3755 }
3756
3757 PDATA_POP(self->stack, clsraw);
3758 cls = (PyTypeObject *)clsraw;
3759 if (cls == NULL) goto Fail;
3760 if (! PyType_Check(cls)) {
3761 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3762 "isn't a type object");
3763 goto Fail;
3764 }
3765 if (cls->tp_new == NULL) {
3766 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3767 "has NULL tp_new");
3768 goto Fail;
3769 }
3770
3771 /* Call __new__. */
3772 obj = cls->tp_new(cls, args, NULL);
3773 if (obj == NULL) goto Fail;
3774
3775 Py_DECREF(args);
3776 Py_DECREF(clsraw);
3777 PDATA_PUSH(self->stack, obj, -1);
3778 return 0;
3779
3780 Fail:
3781 Py_XDECREF(args);
3782 Py_XDECREF(clsraw);
3783 return -1;
3784}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003785
3786static int
Tim Peterscba30e22003-02-01 06:24:36 +00003787load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003788{
3789 PyObject *class = 0, *module_name = 0, *class_name = 0;
3790 int len;
3791 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003792
Tim Peters0bc93f52003-02-02 18:29:33 +00003793 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003794 if (len < 2) return bad_readline();
3795 module_name = PyString_FromStringAndSize(s, len - 1);
3796 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003797
Tim Peters0bc93f52003-02-02 18:29:33 +00003798 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003799 if (len < 2) {
3800 Py_DECREF(module_name);
3801 return bad_readline();
3802 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003803 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003804 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003805 self->find_class);
3806 Py_DECREF(class_name);
3807 }
3808 }
3809 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003810
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003811 if (! class) return -1;
3812 PDATA_PUSH(self->stack, class, -1);
3813 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003814}
3815
3816
3817static int
Tim Peterscba30e22003-02-01 06:24:36 +00003818load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003819{
3820 PyObject *pid = 0;
3821 int len;
3822 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003824 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003825 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003826 if (len < 2) return bad_readline();
3827
3828 pid = PyString_FromStringAndSize(s, len - 1);
3829 if (!pid) return -1;
3830
3831 if (PyList_Check(self->pers_func)) {
3832 if (PyList_Append(self->pers_func, pid) < 0) {
3833 Py_DECREF(pid);
3834 return -1;
3835 }
3836 }
3837 else {
3838 ARG_TUP(self, pid);
3839 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003840 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003841 NULL);
3842 FREE_ARG_TUP(self);
3843 }
3844 }
3845
3846 if (! pid) return -1;
3847
3848 PDATA_PUSH(self->stack, pid, -1);
3849 return 0;
3850 }
3851 else {
3852 PyErr_SetString(UnpicklingError,
3853 "A load persistent id instruction was encountered,\n"
3854 "but no persistent_load function was specified.");
3855 return -1;
3856 }
3857}
3858
3859static int
Tim Peterscba30e22003-02-01 06:24:36 +00003860load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003861{
3862 PyObject *pid = 0;
3863
3864 if (self->pers_func) {
3865 PDATA_POP(self->stack, pid);
3866 if (! pid) return -1;
3867
3868 if (PyList_Check(self->pers_func)) {
3869 if (PyList_Append(self->pers_func, pid) < 0) {
3870 Py_DECREF(pid);
3871 return -1;
3872 }
3873 }
3874 else {
3875 ARG_TUP(self, pid);
3876 if (self->arg) {
3877 pid = PyObject_Call(self->pers_func, self->arg,
3878 NULL);
3879 FREE_ARG_TUP(self);
3880 }
3881 if (! pid) return -1;
3882 }
3883
3884 PDATA_PUSH(self->stack, pid, -1);
3885 return 0;
3886 }
3887 else {
3888 PyErr_SetString(UnpicklingError,
3889 "A load persistent id instruction was encountered,\n"
3890 "but no persistent_load function was specified.");
3891 return -1;
3892 }
3893}
3894
3895
3896static int
Tim Peterscba30e22003-02-01 06:24:36 +00003897load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003898{
3899 int len;
3900
3901 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3902
3903 /* Note that we split the (pickle.py) stack into two stacks,
3904 an object stack and a mark stack. We have to be clever and
3905 pop the right one. We do this by looking at the top of the
3906 mark stack.
3907 */
3908
3909 if ((self->num_marks > 0) &&
3910 (self->marks[self->num_marks - 1] == len))
3911 self->num_marks--;
3912 else {
3913 len--;
3914 Py_DECREF(self->stack->data[len]);
3915 self->stack->length=len;
3916 }
3917
3918 return 0;
3919}
3920
3921
3922static int
Tim Peterscba30e22003-02-01 06:24:36 +00003923load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003924{
3925 int i;
3926
3927 if ((i = marker(self)) < 0)
3928 return -1;
3929
3930 Pdata_clear(self->stack, i);
3931
3932 return 0;
3933}
3934
3935
3936static int
Tim Peterscba30e22003-02-01 06:24:36 +00003937load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003938{
3939 PyObject *last;
3940 int len;
3941
3942 if ((len = self->stack->length) <= 0) return stackUnderflow();
3943 last=self->stack->data[len-1];
3944 Py_INCREF(last);
3945 PDATA_PUSH(self->stack, last, -1);
3946 return 0;
3947}
3948
3949
3950static int
Tim Peterscba30e22003-02-01 06:24:36 +00003951load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003952{
3953 PyObject *py_str = 0, *value = 0;
3954 int len;
3955 char *s;
3956 int rc;
3957
Tim Peters0bc93f52003-02-02 18:29:33 +00003958 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003959 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003960
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003961 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003963 value = PyDict_GetItem(self->memo, py_str);
3964 if (! value) {
3965 PyErr_SetObject(BadPickleGet, py_str);
3966 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003967 }
3968 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003969 PDATA_APPEND(self->stack, value, -1);
3970 rc = 0;
3971 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003972
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003973 Py_DECREF(py_str);
3974 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003975}
3976
3977
3978static int
Tim Peterscba30e22003-02-01 06:24:36 +00003979load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003980{
3981 PyObject *py_key = 0, *value = 0;
3982 unsigned char key;
3983 char *s;
3984 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003985
Tim Peters0bc93f52003-02-02 18:29:33 +00003986 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003987
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003988 key = (unsigned char)s[0];
3989 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003990
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003991 value = PyDict_GetItem(self->memo, py_key);
3992 if (! value) {
3993 PyErr_SetObject(BadPickleGet, py_key);
3994 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003995 }
3996 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003997 PDATA_APPEND(self->stack, value, -1);
3998 rc = 0;
3999 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004001 Py_DECREF(py_key);
4002 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004003}
4004
4005
4006static int
Tim Peterscba30e22003-02-01 06:24:36 +00004007load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004008{
4009 PyObject *py_key = 0, *value = 0;
4010 unsigned char c;
4011 char *s;
4012 long key;
4013 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004014
Tim Peters0bc93f52003-02-02 18:29:33 +00004015 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004016
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004017 c = (unsigned char)s[0];
4018 key = (long)c;
4019 c = (unsigned char)s[1];
4020 key |= (long)c << 8;
4021 c = (unsigned char)s[2];
4022 key |= (long)c << 16;
4023 c = (unsigned char)s[3];
4024 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004026 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4027
4028 value = PyDict_GetItem(self->memo, py_key);
4029 if (! value) {
4030 PyErr_SetObject(BadPickleGet, py_key);
4031 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004032 }
4033 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004034 PDATA_APPEND(self->stack, value, -1);
4035 rc = 0;
4036 }
4037
4038 Py_DECREF(py_key);
4039 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004040}
4041
Tim Peters2d629652003-02-04 05:06:17 +00004042/* Push an object from the extension registry (EXT[124]). nbytes is
4043 * the number of bytes following the opcode, holding the index (code) value.
4044 */
4045static int
4046load_extension(Unpicklerobject *self, int nbytes)
4047{
4048 char *codebytes; /* the nbytes bytes after the opcode */
4049 long code; /* calc_binint returns long */
4050 PyObject *py_code; /* code as a Python int */
4051 PyObject *obj; /* the object to push */
4052 PyObject *pair; /* (module_name, class_name) */
4053 PyObject *module_name, *class_name;
4054
4055 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4056 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4057 code = calc_binint(codebytes, nbytes);
4058 if (code <= 0) { /* note that 0 is forbidden */
4059 /* Corrupt or hostile pickle. */
4060 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
4061 return -1;
4062 }
4063
4064 /* Look for the code in the cache. */
4065 py_code = PyInt_FromLong(code);
4066 if (py_code == NULL) return -1;
4067 obj = PyDict_GetItem(extension_cache, py_code);
4068 if (obj != NULL) {
4069 /* Bingo. */
4070 Py_DECREF(py_code);
4071 PDATA_APPEND(self->stack, obj, -1);
4072 return 0;
4073 }
4074
4075 /* Look up the (module_name, class_name) pair. */
4076 pair = PyDict_GetItem(inverted_registry, py_code);
4077 if (pair == NULL) {
4078 Py_DECREF(py_code);
4079 PyErr_Format(PyExc_ValueError, "unregistered extension "
4080 "code %ld", code);
4081 return -1;
4082 }
4083 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00004084 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00004085 */
4086 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
4087 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
4088 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
4089 Py_DECREF(py_code);
4090 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
4091 "isn't a 2-tuple of strings", code);
4092 return -1;
4093 }
4094 /* Load the object. */
4095 obj = find_class(module_name, class_name, self->find_class);
4096 if (obj == NULL) {
4097 Py_DECREF(py_code);
4098 return -1;
4099 }
4100 /* Cache code -> obj. */
4101 code = PyDict_SetItem(extension_cache, py_code, obj);
4102 Py_DECREF(py_code);
4103 if (code < 0) {
4104 Py_DECREF(obj);
4105 return -1;
4106 }
4107 PDATA_PUSH(self->stack, obj, -1);
4108 return 0;
4109}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004110
4111static int
Tim Peterscba30e22003-02-01 06:24:36 +00004112load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004113{
4114 PyObject *py_str = 0, *value = 0;
4115 int len, l;
4116 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004117
Tim Peters0bc93f52003-02-02 18:29:33 +00004118 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004119 if (l < 2) return bad_readline();
4120 if (!( len=self->stack->length )) return stackUnderflow();
4121 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
4122 value=self->stack->data[len-1];
4123 l=PyDict_SetItem(self->memo, py_str, value);
4124 Py_DECREF(py_str);
4125 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004126}
4127
4128
4129static int
Tim Peterscba30e22003-02-01 06:24:36 +00004130load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004131{
4132 PyObject *py_key = 0, *value = 0;
4133 unsigned char key;
4134 char *s;
4135 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004136
Tim Peters0bc93f52003-02-02 18:29:33 +00004137 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004138 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004140 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00004141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004142 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4143 value=self->stack->data[len-1];
4144 len=PyDict_SetItem(self->memo, py_key, value);
4145 Py_DECREF(py_key);
4146 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004147}
4148
4149
4150static int
Tim Peterscba30e22003-02-01 06:24:36 +00004151load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004152{
4153 PyObject *py_key = 0, *value = 0;
4154 long key;
4155 unsigned char c;
4156 char *s;
4157 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004158
Tim Peters0bc93f52003-02-02 18:29:33 +00004159 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004160 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004161
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004162 c = (unsigned char)s[0];
4163 key = (long)c;
4164 c = (unsigned char)s[1];
4165 key |= (long)c << 8;
4166 c = (unsigned char)s[2];
4167 key |= (long)c << 16;
4168 c = (unsigned char)s[3];
4169 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00004170
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004171 if (!( py_key = PyInt_FromLong(key))) return -1;
4172 value=self->stack->data[len-1];
4173 len=PyDict_SetItem(self->memo, py_key, value);
4174 Py_DECREF(py_key);
4175 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004176}
4177
4178
4179static int
Tim Peterscba30e22003-02-01 06:24:36 +00004180do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004181{
4182 PyObject *value = 0, *list = 0, *append_method = 0;
4183 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004185 len=self->stack->length;
4186 if (!( len >= x && x > 0 )) return stackUnderflow();
4187 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00004188 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004190 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004192 if (PyList_Check(list)) {
4193 PyObject *slice;
4194 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00004195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004196 slice=Pdata_popList(self->stack, x);
Neal Norwitzb59d08c2006-07-22 16:20:49 +00004197 if (! slice) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004198 list_len = PyList_GET_SIZE(list);
4199 i=PyList_SetSlice(list, list_len, list_len, slice);
4200 Py_DECREF(slice);
4201 return i;
4202 }
4203 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004204
Tim Peterscba30e22003-02-01 06:24:36 +00004205 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004206 return -1;
4207
4208 for (i = x; i < len; i++) {
4209 PyObject *junk;
4210
4211 value=self->stack->data[i];
4212 junk=0;
4213 ARG_TUP(self, value);
4214 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004215 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004216 NULL);
4217 FREE_ARG_TUP(self);
4218 }
4219 if (! junk) {
4220 Pdata_clear(self->stack, i+1);
4221 self->stack->length=x;
4222 Py_DECREF(append_method);
4223 return -1;
4224 }
4225 Py_DECREF(junk);
4226 }
4227 self->stack->length=x;
4228 Py_DECREF(append_method);
4229 }
4230
4231 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004232}
4233
4234
4235static int
Tim Peterscba30e22003-02-01 06:24:36 +00004236load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004237{
4238 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004239}
4240
4241
4242static int
Tim Peterscba30e22003-02-01 06:24:36 +00004243load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004244{
4245 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004246}
4247
4248
4249static int
Tim Peterscba30e22003-02-01 06:24:36 +00004250do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004251{
4252 PyObject *value = 0, *key = 0, *dict = 0;
4253 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004254
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004255 if (!( (len=self->stack->length) >= x
4256 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004257
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004258 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004259
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004260 for (i = x+1; i < len; i += 2) {
4261 key =self->stack->data[i-1];
4262 value=self->stack->data[i ];
4263 if (PyObject_SetItem(dict, key, value) < 0) {
4264 r=-1;
4265 break;
4266 }
4267 }
4268
4269 Pdata_clear(self->stack, x);
4270
4271 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004272}
4273
4274
Tim Peters84e87f32001-03-17 04:50:51 +00004275static int
Tim Peterscba30e22003-02-01 06:24:36 +00004276load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004277{
4278 return do_setitems(self, self->stack->length - 2);
4279}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004281static int
Tim Peterscba30e22003-02-01 06:24:36 +00004282load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004283{
4284 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004285}
4286
Tim Peters84e87f32001-03-17 04:50:51 +00004287
Guido van Rossum60456fd1997-04-09 17:36:32 +00004288static int
Tim Peterscba30e22003-02-01 06:24:36 +00004289load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004290{
Tim Peters080c88b2003-02-15 03:01:11 +00004291 PyObject *state, *inst, *slotstate;
4292 PyObject *__setstate__;
4293 PyObject *d_key, *d_value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004294 Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00004295 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004296
Tim Peters080c88b2003-02-15 03:01:11 +00004297 /* Stack is ... instance, state. We want to leave instance at
4298 * the stack top, possibly mutated via instance.__setstate__(state).
4299 */
4300 if (self->stack->length < 2)
4301 return stackUnderflow();
4302 PDATA_POP(self->stack, state);
4303 if (state == NULL)
4304 return -1;
4305 inst = self->stack->data[self->stack->length - 1];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004306
Tim Peters080c88b2003-02-15 03:01:11 +00004307 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
4308 if (__setstate__ != NULL) {
4309 PyObject *junk = NULL;
4310
4311 /* The explicit __setstate__ is responsible for everything. */
4312 ARG_TUP(self, state);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004313 if (self->arg) {
4314 junk = PyObject_Call(__setstate__, self->arg, NULL);
4315 FREE_ARG_TUP(self);
4316 }
4317 Py_DECREF(__setstate__);
Tim Peters080c88b2003-02-15 03:01:11 +00004318 if (junk == NULL)
4319 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004320 Py_DECREF(junk);
4321 return 0;
4322 }
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00004323 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4324 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004325 PyErr_Clear();
Tim Peters080c88b2003-02-15 03:01:11 +00004326
4327 /* A default __setstate__. First see whether state embeds a
4328 * slot state dict too (a proto 2 addition).
4329 */
4330 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
4331 PyObject *temp = state;
4332 state = PyTuple_GET_ITEM(temp, 0);
4333 slotstate = PyTuple_GET_ITEM(temp, 1);
4334 Py_INCREF(state);
4335 Py_INCREF(slotstate);
4336 Py_DECREF(temp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004337 }
Tim Peters080c88b2003-02-15 03:01:11 +00004338 else
4339 slotstate = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004340
Tim Peters080c88b2003-02-15 03:01:11 +00004341 /* Set inst.__dict__ from the state dict (if any). */
4342 if (state != Py_None) {
4343 PyObject *dict;
4344 if (! PyDict_Check(state)) {
4345 PyErr_SetString(UnpicklingError, "state is not a "
4346 "dictionary");
4347 goto finally;
4348 }
4349 dict = PyObject_GetAttr(inst, __dict___str);
4350 if (dict == NULL)
4351 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004352
Tim Peters080c88b2003-02-15 03:01:11 +00004353 i = 0;
4354 while (PyDict_Next(state, &i, &d_key, &d_value)) {
4355 if (PyObject_SetItem(dict, d_key, d_value) < 0)
4356 goto finally;
4357 }
4358 Py_DECREF(dict);
4359 }
4360
4361 /* Also set instance attributes from the slotstate dict (if any). */
4362 if (slotstate != NULL) {
4363 if (! PyDict_Check(slotstate)) {
4364 PyErr_SetString(UnpicklingError, "slot state is not "
4365 "a dictionary");
4366 goto finally;
4367 }
4368 i = 0;
4369 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4370 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4371 goto finally;
4372 }
4373 }
4374 res = 0;
4375
4376 finally:
4377 Py_DECREF(state);
4378 Py_XDECREF(slotstate);
4379 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004380}
4381
4382
4383static int
Tim Peterscba30e22003-02-01 06:24:36 +00004384load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004385{
4386 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004387
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004388 /* Note that we split the (pickle.py) stack into two stacks, an
4389 object stack and a mark stack. Here we push a mark onto the
4390 mark stack.
4391 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004393 if ((self->num_marks + 1) >= self->marks_size) {
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +00004394 int *marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004395 s=self->marks_size+20;
4396 if (s <= self->num_marks) s=self->num_marks + 1;
4397 if (self->marks == NULL)
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +00004398 marks=(int *)malloc(s * sizeof(int));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004399 else
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +00004400 marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004401 s * sizeof(int));
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +00004402 if (!marks) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004403 PyErr_NoMemory();
4404 return -1;
4405 }
Kristján Valur Jónsson5e4e31f2007-04-21 12:46:49 +00004406 self->marks = marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004407 self->marks_size = s;
4408 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004409
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004410 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004411
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004412 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004413}
4414
Guido van Rossum60456fd1997-04-09 17:36:32 +00004415static int
Tim Peterscba30e22003-02-01 06:24:36 +00004416load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004417{
4418 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004420 PDATA_POP(self->stack, arg_tup);
4421 if (! arg_tup) return -1;
4422 PDATA_POP(self->stack, callable);
4423 if (callable) {
4424 ob = Instance_New(callable, arg_tup);
4425 Py_DECREF(callable);
4426 }
4427 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004428
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004429 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004430
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004431 PDATA_PUSH(self->stack, ob, -1);
4432 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004433}
Tim Peters84e87f32001-03-17 04:50:51 +00004434
Tim Peters4190fb82003-02-02 16:09:05 +00004435/* Just raises an error if we don't know the protocol specified. PROTO
4436 * is the first opcode for protocols >= 2.
4437 */
4438static int
4439load_proto(Unpicklerobject *self)
4440{
4441 int i;
4442 char *protobyte;
4443
4444 i = self->read_func(self, &protobyte, 1);
4445 if (i < 0)
4446 return -1;
4447
4448 i = calc_binint(protobyte, 1);
4449 /* No point checking for < 0, since calc_binint returns an unsigned
4450 * int when chewing on 1 byte.
4451 */
4452 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004453 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004454 return 0;
4455
4456 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4457 return -1;
4458}
4459
Guido van Rossum60456fd1997-04-09 17:36:32 +00004460static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004461load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004462{
4463 PyObject *err = 0, *val = 0;
4464 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004466 self->num_marks = 0;
4467 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004468
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004469 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004470 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004471 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004473 switch (s[0]) {
4474 case NONE:
4475 if (load_none(self) < 0)
4476 break;
4477 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004478
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004479 case BININT:
4480 if (load_binint(self) < 0)
4481 break;
4482 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004483
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004484 case BININT1:
4485 if (load_binint1(self) < 0)
4486 break;
4487 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004489 case BININT2:
4490 if (load_binint2(self) < 0)
4491 break;
4492 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004493
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004494 case INT:
4495 if (load_int(self) < 0)
4496 break;
4497 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004499 case LONG:
4500 if (load_long(self) < 0)
4501 break;
4502 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004503
Tim Petersee1a53c2003-02-02 02:57:53 +00004504 case LONG1:
4505 if (load_counted_long(self, 1) < 0)
4506 break;
4507 continue;
4508
4509 case LONG4:
4510 if (load_counted_long(self, 4) < 0)
4511 break;
4512 continue;
4513
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004514 case FLOAT:
4515 if (load_float(self) < 0)
4516 break;
4517 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004518
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004519 case BINFLOAT:
4520 if (load_binfloat(self) < 0)
4521 break;
4522 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004524 case BINSTRING:
4525 if (load_binstring(self) < 0)
4526 break;
4527 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004528
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004529 case SHORT_BINSTRING:
4530 if (load_short_binstring(self) < 0)
4531 break;
4532 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004533
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004534 case STRING:
4535 if (load_string(self) < 0)
4536 break;
4537 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004538
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004539#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004540 case UNICODE:
4541 if (load_unicode(self) < 0)
4542 break;
4543 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004545 case BINUNICODE:
4546 if (load_binunicode(self) < 0)
4547 break;
4548 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004549#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004550
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004551 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004552 if (load_counted_tuple(self, 0) < 0)
4553 break;
4554 continue;
4555
4556 case TUPLE1:
4557 if (load_counted_tuple(self, 1) < 0)
4558 break;
4559 continue;
4560
4561 case TUPLE2:
4562 if (load_counted_tuple(self, 2) < 0)
4563 break;
4564 continue;
4565
4566 case TUPLE3:
4567 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004568 break;
4569 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004571 case TUPLE:
4572 if (load_tuple(self) < 0)
4573 break;
4574 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004576 case EMPTY_LIST:
4577 if (load_empty_list(self) < 0)
4578 break;
4579 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004580
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004581 case LIST:
4582 if (load_list(self) < 0)
4583 break;
4584 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004585
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004586 case EMPTY_DICT:
4587 if (load_empty_dict(self) < 0)
4588 break;
4589 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004590
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004591 case DICT:
4592 if (load_dict(self) < 0)
4593 break;
4594 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004595
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004596 case OBJ:
4597 if (load_obj(self) < 0)
4598 break;
4599 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004600
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004601 case INST:
4602 if (load_inst(self) < 0)
4603 break;
4604 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004605
Tim Peterseab7db32003-02-13 18:24:14 +00004606 case NEWOBJ:
4607 if (load_newobj(self) < 0)
4608 break;
4609 continue;
4610
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004611 case GLOBAL:
4612 if (load_global(self) < 0)
4613 break;
4614 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004615
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004616 case APPEND:
4617 if (load_append(self) < 0)
4618 break;
4619 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004621 case APPENDS:
4622 if (load_appends(self) < 0)
4623 break;
4624 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004625
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004626 case BUILD:
4627 if (load_build(self) < 0)
4628 break;
4629 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004631 case DUP:
4632 if (load_dup(self) < 0)
4633 break;
4634 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004635
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004636 case BINGET:
4637 if (load_binget(self) < 0)
4638 break;
4639 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004640
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004641 case LONG_BINGET:
4642 if (load_long_binget(self) < 0)
4643 break;
4644 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004645
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004646 case GET:
4647 if (load_get(self) < 0)
4648 break;
4649 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004650
Tim Peters2d629652003-02-04 05:06:17 +00004651 case EXT1:
4652 if (load_extension(self, 1) < 0)
4653 break;
4654 continue;
4655
4656 case EXT2:
4657 if (load_extension(self, 2) < 0)
4658 break;
4659 continue;
4660
4661 case EXT4:
4662 if (load_extension(self, 4) < 0)
4663 break;
4664 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004665 case MARK:
4666 if (load_mark(self) < 0)
4667 break;
4668 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004669
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004670 case BINPUT:
4671 if (load_binput(self) < 0)
4672 break;
4673 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004675 case LONG_BINPUT:
4676 if (load_long_binput(self) < 0)
4677 break;
4678 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004680 case PUT:
4681 if (load_put(self) < 0)
4682 break;
4683 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004685 case POP:
4686 if (load_pop(self) < 0)
4687 break;
4688 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004690 case POP_MARK:
4691 if (load_pop_mark(self) < 0)
4692 break;
4693 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004694
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004695 case SETITEM:
4696 if (load_setitem(self) < 0)
4697 break;
4698 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004700 case SETITEMS:
4701 if (load_setitems(self) < 0)
4702 break;
4703 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004705 case STOP:
4706 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004708 case PERSID:
4709 if (load_persid(self) < 0)
4710 break;
4711 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004713 case BINPERSID:
4714 if (load_binpersid(self) < 0)
4715 break;
4716 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004718 case REDUCE:
4719 if (load_reduce(self) < 0)
4720 break;
4721 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004722
Tim Peters4190fb82003-02-02 16:09:05 +00004723 case PROTO:
4724 if (load_proto(self) < 0)
4725 break;
4726 continue;
4727
Tim Peters3c67d792003-02-02 17:59:11 +00004728 case NEWTRUE:
4729 if (load_bool(self, Py_True) < 0)
4730 break;
4731 continue;
4732
4733 case NEWFALSE:
4734 if (load_bool(self, Py_False) < 0)
4735 break;
4736 continue;
4737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004738 case '\0':
4739 /* end of file */
4740 PyErr_SetNone(PyExc_EOFError);
4741 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004742
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004743 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004744 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004745 "invalid load key, '%s'.",
4746 "c", s[0]);
4747 return NULL;
4748 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004749
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004750 break;
4751 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004752
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004753 if ((err = PyErr_Occurred())) {
4754 if (err == PyExc_EOFError) {
4755 PyErr_SetNone(PyExc_EOFError);
4756 }
4757 return NULL;
4758 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004760 PDATA_POP(self->stack, val);
4761 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004762}
Tim Peters84e87f32001-03-17 04:50:51 +00004763
Guido van Rossum60456fd1997-04-09 17:36:32 +00004764
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004765/* No-load functions to support noload, which is used to
4766 find persistent references. */
4767
4768static int
Tim Peterscba30e22003-02-01 06:24:36 +00004769noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004770{
4771 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004773 if ((i = marker(self)) < 0) return -1;
4774 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004775}
4776
4777
4778static int
Tim Peterscba30e22003-02-01 06:24:36 +00004779noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004780{
4781 int i;
4782 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004783
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004784 if ((i = marker(self)) < 0) return -1;
4785 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004786 if (self->readline_func(self, &s) < 0) return -1;
4787 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00004788 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004789 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004790}
4791
4792static int
Tim Peterseab7db32003-02-13 18:24:14 +00004793noload_newobj(Unpicklerobject *self)
4794{
4795 PyObject *obj;
4796
4797 PDATA_POP(self->stack, obj); /* pop argtuple */
4798 if (obj == NULL) return -1;
4799 Py_DECREF(obj);
4800
4801 PDATA_POP(self->stack, obj); /* pop cls */
4802 if (obj == NULL) return -1;
4803 Py_DECREF(obj);
4804
4805 PDATA_APPEND(self->stack, Py_None, -1);
4806 return 0;
4807}
4808
4809static int
Tim Peterscba30e22003-02-01 06:24:36 +00004810noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004811{
4812 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004813
Tim Peters0bc93f52003-02-02 18:29:33 +00004814 if (self->readline_func(self, &s) < 0) return -1;
4815 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004816 PDATA_APPEND(self->stack, Py_None,-1);
4817 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004818}
4819
4820static int
Tim Peterscba30e22003-02-01 06:24:36 +00004821noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004822{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004823
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004824 if (self->stack->length < 2) return stackUnderflow();
4825 Pdata_clear(self->stack, self->stack->length-2);
4826 PDATA_APPEND(self->stack, Py_None,-1);
4827 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004828}
4829
4830static int
4831noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004832
Guido van Rossum053b8df1998-11-25 16:18:00 +00004833 if (self->stack->length < 1) return stackUnderflow();
4834 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004835 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004836}
4837
Tim Peters2d629652003-02-04 05:06:17 +00004838static int
4839noload_extension(Unpicklerobject *self, int nbytes)
4840{
4841 char *codebytes;
4842
4843 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4844 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4845 PDATA_APPEND(self->stack, Py_None, -1);
4846 return 0;
4847}
4848
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004849
4850static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004851noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004852{
4853 PyObject *err = 0, *val = 0;
4854 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004855
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004856 self->num_marks = 0;
4857 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004859 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004860 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004861 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004862
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004863 switch (s[0]) {
4864 case NONE:
4865 if (load_none(self) < 0)
4866 break;
4867 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004869 case BININT:
4870 if (load_binint(self) < 0)
4871 break;
4872 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004873
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004874 case BININT1:
4875 if (load_binint1(self) < 0)
4876 break;
4877 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004878
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004879 case BININT2:
4880 if (load_binint2(self) < 0)
4881 break;
4882 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004883
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004884 case INT:
4885 if (load_int(self) < 0)
4886 break;
4887 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004888
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004889 case LONG:
4890 if (load_long(self) < 0)
4891 break;
4892 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004893
Tim Peters4190fb82003-02-02 16:09:05 +00004894 case LONG1:
4895 if (load_counted_long(self, 1) < 0)
4896 break;
4897 continue;
4898
4899 case LONG4:
4900 if (load_counted_long(self, 4) < 0)
4901 break;
4902 continue;
4903
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004904 case FLOAT:
4905 if (load_float(self) < 0)
4906 break;
4907 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004908
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004909 case BINFLOAT:
4910 if (load_binfloat(self) < 0)
4911 break;
4912 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004913
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004914 case BINSTRING:
4915 if (load_binstring(self) < 0)
4916 break;
4917 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004918
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004919 case SHORT_BINSTRING:
4920 if (load_short_binstring(self) < 0)
4921 break;
4922 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004923
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004924 case STRING:
4925 if (load_string(self) < 0)
4926 break;
4927 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004928
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004929#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004930 case UNICODE:
4931 if (load_unicode(self) < 0)
4932 break;
4933 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004935 case BINUNICODE:
4936 if (load_binunicode(self) < 0)
4937 break;
4938 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004939#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004941 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004942 if (load_counted_tuple(self, 0) < 0)
4943 break;
4944 continue;
4945
4946 case TUPLE1:
4947 if (load_counted_tuple(self, 1) < 0)
4948 break;
4949 continue;
4950
4951 case TUPLE2:
4952 if (load_counted_tuple(self, 2) < 0)
4953 break;
4954 continue;
4955
4956 case TUPLE3:
4957 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004958 break;
4959 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004960
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004961 case TUPLE:
4962 if (load_tuple(self) < 0)
4963 break;
4964 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004966 case EMPTY_LIST:
4967 if (load_empty_list(self) < 0)
4968 break;
4969 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004970
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004971 case LIST:
4972 if (load_list(self) < 0)
4973 break;
4974 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004975
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004976 case EMPTY_DICT:
4977 if (load_empty_dict(self) < 0)
4978 break;
4979 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004981 case DICT:
4982 if (load_dict(self) < 0)
4983 break;
4984 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004985
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004986 case OBJ:
4987 if (noload_obj(self) < 0)
4988 break;
4989 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004990
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004991 case INST:
4992 if (noload_inst(self) < 0)
4993 break;
4994 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004995
Tim Peterseab7db32003-02-13 18:24:14 +00004996 case NEWOBJ:
4997 if (noload_newobj(self) < 0)
4998 break;
4999 continue;
5000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005001 case GLOBAL:
5002 if (noload_global(self) < 0)
5003 break;
5004 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005005
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005006 case APPEND:
5007 if (load_append(self) < 0)
5008 break;
5009 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005010
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005011 case APPENDS:
5012 if (load_appends(self) < 0)
5013 break;
5014 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005015
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005016 case BUILD:
5017 if (noload_build(self) < 0)
5018 break;
5019 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005021 case DUP:
5022 if (load_dup(self) < 0)
5023 break;
5024 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005025
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005026 case BINGET:
5027 if (load_binget(self) < 0)
5028 break;
5029 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005031 case LONG_BINGET:
5032 if (load_long_binget(self) < 0)
5033 break;
5034 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005035
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005036 case GET:
5037 if (load_get(self) < 0)
5038 break;
5039 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005040
Tim Peters2d629652003-02-04 05:06:17 +00005041 case EXT1:
5042 if (noload_extension(self, 1) < 0)
5043 break;
5044 continue;
5045
5046 case EXT2:
5047 if (noload_extension(self, 2) < 0)
5048 break;
5049 continue;
5050
5051 case EXT4:
5052 if (noload_extension(self, 4) < 0)
5053 break;
5054 continue;
5055
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005056 case MARK:
5057 if (load_mark(self) < 0)
5058 break;
5059 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005061 case BINPUT:
5062 if (load_binput(self) < 0)
5063 break;
5064 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005065
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005066 case LONG_BINPUT:
5067 if (load_long_binput(self) < 0)
5068 break;
5069 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005070
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005071 case PUT:
5072 if (load_put(self) < 0)
5073 break;
5074 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005075
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005076 case POP:
5077 if (load_pop(self) < 0)
5078 break;
5079 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005080
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005081 case POP_MARK:
5082 if (load_pop_mark(self) < 0)
5083 break;
5084 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005085
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005086 case SETITEM:
5087 if (load_setitem(self) < 0)
5088 break;
5089 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005090
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005091 case SETITEMS:
5092 if (load_setitems(self) < 0)
5093 break;
5094 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005095
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005096 case STOP:
5097 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005098
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005099 case PERSID:
5100 if (load_persid(self) < 0)
5101 break;
5102 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005103
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005104 case BINPERSID:
5105 if (load_binpersid(self) < 0)
5106 break;
5107 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005108
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005109 case REDUCE:
5110 if (noload_reduce(self) < 0)
5111 break;
5112 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005113
Tim Peters4190fb82003-02-02 16:09:05 +00005114 case PROTO:
5115 if (load_proto(self) < 0)
5116 break;
5117 continue;
5118
Tim Peters3c67d792003-02-02 17:59:11 +00005119 case NEWTRUE:
5120 if (load_bool(self, Py_True) < 0)
5121 break;
5122 continue;
5123
5124 case NEWFALSE:
5125 if (load_bool(self, Py_False) < 0)
5126 break;
5127 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005128 default:
Tim Peterscba30e22003-02-01 06:24:36 +00005129 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005130 "invalid load key, '%s'.",
5131 "c", s[0]);
5132 return NULL;
5133 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005135 break;
5136 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005138 if ((err = PyErr_Occurred())) {
5139 if (err == PyExc_EOFError) {
5140 PyErr_SetNone(PyExc_EOFError);
5141 }
5142 return NULL;
5143 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005144
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005145 PDATA_POP(self->stack, val);
5146 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005147}
Tim Peters84e87f32001-03-17 04:50:51 +00005148
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005149
Guido van Rossum60456fd1997-04-09 17:36:32 +00005150static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005151Unpickler_load(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005152{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005153 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005154}
5155
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005156static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005157Unpickler_noload(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005158{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005159 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005160}
5161
Guido van Rossum60456fd1997-04-09 17:36:32 +00005162
5163static struct PyMethodDef Unpickler_methods[] = {
Georg Brandl96a8c392006-05-29 21:04:52 +00005164 {"load", (PyCFunction)Unpickler_load, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005165 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005166 },
Georg Brandl96a8c392006-05-29 21:04:52 +00005167 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005168 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005169 "noload() -- not load a pickle, but go through most of the motions\n"
5170 "\n"
5171 "This function can be used to read past a pickle without instantiating\n"
5172 "any objects or importing any modules. It can also be used to find all\n"
5173 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00005174 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005175 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00005176 {NULL, NULL} /* sentinel */
5177};
5178
5179
5180static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00005181newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005182{
5183 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005184
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005185 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005186 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005188 self->file = NULL;
5189 self->arg = NULL;
5190 self->stack = (Pdata*)Pdata_New();
5191 self->pers_func = NULL;
5192 self->last_string = NULL;
5193 self->marks = NULL;
5194 self->num_marks = 0;
5195 self->marks_size = 0;
5196 self->buf_size = 0;
5197 self->read = NULL;
5198 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005199 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005200
Tim Peterscba30e22003-02-01 06:24:36 +00005201 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005202 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005203
Neal Norwitzb59d08c2006-07-22 16:20:49 +00005204 if (!self->stack)
5205 goto err;
5206
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005207 Py_INCREF(f);
5208 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005209
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005210 /* Set read, readline based on type of f */
5211 if (PyFile_Check(f)) {
5212 self->fp = PyFile_AsFile(f);
5213 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00005214 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005215 "I/O operation on closed file");
5216 goto err;
5217 }
5218 self->read_func = read_file;
5219 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00005220 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005221 else if (PycStringIO_InputCheck(f)) {
5222 self->fp = NULL;
5223 self->read_func = read_cStringIO;
5224 self->readline_func = readline_cStringIO;
5225 }
5226 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00005227
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005228 self->fp = NULL;
5229 self->read_func = read_other;
5230 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005232 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
5233 (self->read = PyObject_GetAttr(f, read_str)))) {
5234 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00005235 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005236 "argument must have 'read' and "
5237 "'readline' attributes" );
5238 goto err;
5239 }
5240 }
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005241 PyObject_GC_Track(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005243 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005245 err:
5246 Py_DECREF((PyObject *)self);
5247 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005248}
5249
5250
5251static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005252get_Unpickler(PyObject *self, PyObject *file)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005253{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005254 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005255}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005256
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005257
Guido van Rossum60456fd1997-04-09 17:36:32 +00005258static void
Tim Peterscba30e22003-02-01 06:24:36 +00005259Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005260{
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005261 PyObject_GC_UnTrack((PyObject *)self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005262 Py_XDECREF(self->readline);
5263 Py_XDECREF(self->read);
5264 Py_XDECREF(self->file);
5265 Py_XDECREF(self->memo);
5266 Py_XDECREF(self->stack);
5267 Py_XDECREF(self->pers_func);
5268 Py_XDECREF(self->arg);
5269 Py_XDECREF(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00005270 Py_XDECREF(self->find_class);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005272 if (self->marks) {
5273 free(self->marks);
5274 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005275
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005276 if (self->buf_size) {
5277 free(self->buf);
5278 }
Tim Peters84e87f32001-03-17 04:50:51 +00005279
Tim Peters3cfe7542003-05-21 21:29:48 +00005280 self->ob_type->tp_free((PyObject *)self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005281}
5282
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005283static int
5284Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
5285{
Thomas Woutersc6e55062006-04-15 21:47:09 +00005286 Py_VISIT(self->readline);
5287 Py_VISIT(self->read);
5288 Py_VISIT(self->file);
5289 Py_VISIT(self->memo);
5290 Py_VISIT(self->stack);
5291 Py_VISIT(self->pers_func);
5292 Py_VISIT(self->arg);
5293 Py_VISIT(self->last_string);
5294 Py_VISIT(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005295 return 0;
5296}
5297
5298static int
5299Unpickler_clear(Unpicklerobject *self)
5300{
Thomas Woutersedf17d82006-04-15 17:28:34 +00005301 Py_CLEAR(self->readline);
5302 Py_CLEAR(self->read);
5303 Py_CLEAR(self->file);
5304 Py_CLEAR(self->memo);
5305 Py_CLEAR(self->stack);
5306 Py_CLEAR(self->pers_func);
5307 Py_CLEAR(self->arg);
5308 Py_CLEAR(self->last_string);
5309 Py_CLEAR(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005310 return 0;
5311}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005312
5313static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005314Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005315{
5316 if (!strcmp(name, "persistent_load")) {
5317 if (!self->pers_func) {
5318 PyErr_SetString(PyExc_AttributeError, name);
5319 return NULL;
5320 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005322 Py_INCREF(self->pers_func);
5323 return self->pers_func;
5324 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005326 if (!strcmp(name, "find_global")) {
5327 if (!self->find_class) {
5328 PyErr_SetString(PyExc_AttributeError, name);
5329 return NULL;
5330 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005331
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005332 Py_INCREF(self->find_class);
5333 return self->find_class;
5334 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005336 if (!strcmp(name, "memo")) {
5337 if (!self->memo) {
5338 PyErr_SetString(PyExc_AttributeError, name);
5339 return NULL;
5340 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005341
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005342 Py_INCREF(self->memo);
5343 return self->memo;
5344 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005345
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005346 if (!strcmp(name, "UnpicklingError")) {
5347 Py_INCREF(UnpicklingError);
5348 return UnpicklingError;
5349 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005350
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005351 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005352}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005353
Guido van Rossum60456fd1997-04-09 17:36:32 +00005354
5355static int
Tim Peterscba30e22003-02-01 06:24:36 +00005356Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005357{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005359 if (!strcmp(name, "persistent_load")) {
5360 Py_XDECREF(self->pers_func);
5361 self->pers_func = value;
5362 Py_XINCREF(value);
5363 return 0;
5364 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005365
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005366 if (!strcmp(name, "find_global")) {
5367 Py_XDECREF(self->find_class);
5368 self->find_class = value;
5369 Py_XINCREF(value);
5370 return 0;
5371 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005372
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005373 if (! value) {
5374 PyErr_SetString(PyExc_TypeError,
5375 "attribute deletion is not supported");
5376 return -1;
5377 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005378
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005379 if (strcmp(name, "memo") == 0) {
5380 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005381 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005382 "memo must be a dictionary");
5383 return -1;
5384 }
5385 Py_XDECREF(self->memo);
5386 self->memo = value;
5387 Py_INCREF(value);
5388 return 0;
5389 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005390
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005391 PyErr_SetString(PyExc_AttributeError, name);
5392 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005393}
5394
Tim Peters5bd2a792003-02-01 16:45:06 +00005395/* ---------------------------------------------------------------------------
5396 * Module-level functions.
5397 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005398
Martin v. Löwis544f1192004-07-27 05:22:33 +00005399/* dump(obj, file, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005400static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005401cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005402{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005403 static char *kwlist[] = {"obj", "file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005404 PyObject *ob, *file, *res = NULL;
5405 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005406 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005407
Martin v. Löwis544f1192004-07-27 05:22:33 +00005408 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5409 &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005410 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005411
Tim Peters5bd2a792003-02-01 16:45:06 +00005412 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005413 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005414
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005415 if (dump(pickler, ob) < 0)
5416 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005417
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005418 Py_INCREF(Py_None);
5419 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005420
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005421 finally:
5422 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005424 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005425}
5426
5427
Martin v. Löwis544f1192004-07-27 05:22:33 +00005428/* dumps(obj, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005429static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005430cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005431{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005432 static char *kwlist[] = {"obj", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005433 PyObject *ob, *file = 0, *res = NULL;
5434 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005435 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005436
Martin v. Löwis544f1192004-07-27 05:22:33 +00005437 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5438 &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005439 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005440
Tim Peterscba30e22003-02-01 06:24:36 +00005441 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005442 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005443
Tim Peters5bd2a792003-02-01 16:45:06 +00005444 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005445 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005447 if (dump(pickler, ob) < 0)
5448 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005449
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005450 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005452 finally:
5453 Py_XDECREF(pickler);
5454 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005455
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005456 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005457}
5458
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005459
Tim Peters5bd2a792003-02-01 16:45:06 +00005460/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005461static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005462cpm_load(PyObject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005463{
5464 Unpicklerobject *unpickler = 0;
Georg Brandl96a8c392006-05-29 21:04:52 +00005465 PyObject *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005466
Tim Peterscba30e22003-02-01 06:24:36 +00005467 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005468 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005469
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005470 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005472 finally:
5473 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005474
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005475 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005476}
5477
5478
Tim Peters5bd2a792003-02-01 16:45:06 +00005479/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005480static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005481cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005482{
5483 PyObject *ob, *file = 0, *res = NULL;
5484 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005485
Tim Peterscba30e22003-02-01 06:24:36 +00005486 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005487 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005488
Tim Peterscba30e22003-02-01 06:24:36 +00005489 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005490 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005491
Tim Peterscba30e22003-02-01 06:24:36 +00005492 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005493 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005494
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005495 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005496
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005497 finally:
5498 Py_XDECREF(file);
5499 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005501 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005502}
5503
5504
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005505PyDoc_STRVAR(Unpicklertype__doc__,
5506"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005507
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005508static PyTypeObject Unpicklertype = {
5509 PyObject_HEAD_INIT(NULL)
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005510 0, /*ob_size*/
5511 "cPickle.Unpickler", /*tp_name*/
5512 sizeof(Unpicklerobject), /*tp_basicsize*/
5513 0,
5514 (destructor)Unpickler_dealloc, /* tp_dealloc */
5515 0, /* tp_print */
5516 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5517 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5518 0, /* tp_compare */
5519 0, /* tp_repr */
5520 0, /* tp_as_number */
5521 0, /* tp_as_sequence */
5522 0, /* tp_as_mapping */
5523 0, /* tp_hash */
5524 0, /* tp_call */
5525 0, /* tp_str */
5526 0, /* tp_getattro */
5527 0, /* tp_setattro */
5528 0, /* tp_as_buffer */
5529 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5530 Unpicklertype__doc__, /* tp_doc */
5531 (traverseproc)Unpickler_traverse, /* tp_traverse */
5532 (inquiry)Unpickler_clear, /* tp_clear */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005533};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005534
Guido van Rossum60456fd1997-04-09 17:36:32 +00005535static struct PyMethodDef cPickle_methods[] = {
Martin v. Löwis544f1192004-07-27 05:22:33 +00005536 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5537 PyDoc_STR("dump(obj, file, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005538 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005539 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005540 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005541 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005542
Martin v. Löwis544f1192004-07-27 05:22:33 +00005543 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5544 PyDoc_STR("dumps(obj, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005545 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005546 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005547 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005548 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005549
Georg Brandl96a8c392006-05-29 21:04:52 +00005550 {"load", (PyCFunction)cpm_load, METH_O,
Neal Norwitz200788c2002-08-13 22:20:41 +00005551 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005552
Neal Norwitzb0493252002-03-31 14:44:22 +00005553 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005554 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005555
Martin v. Löwis544f1192004-07-27 05:22:33 +00005556 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5557 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005558 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005559 "This takes a file-like object for writing a pickle data stream.\n"
5560 "The optional proto argument tells the pickler to use the given\n"
5561 "protocol; supported protocols are 0, 1, 2. The default\n"
5562 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5563 "only protocol that can be written to a file opened in text\n"
5564 "mode and read back successfully. When using a protocol higher\n"
5565 "than 0, make sure the file is opened in binary mode, both when\n"
5566 "pickling and unpickling.)\n"
5567 "\n"
5568 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5569 "more efficient than protocol 1.\n"
5570 "\n"
5571 "Specifying a negative protocol version selects the highest\n"
5572 "protocol version supported. The higher the protocol used, the\n"
5573 "more recent the version of Python needed to read the pickle\n"
5574 "produced.\n"
5575 "\n"
5576 "The file parameter must have a write() method that accepts a single\n"
5577 "string argument. It can thus be an open file object, a StringIO\n"
5578 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005579 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005580
Georg Brandl96a8c392006-05-29 21:04:52 +00005581 {"Unpickler", (PyCFunction)get_Unpickler, METH_O,
Tim Peters5bd2a792003-02-01 16:45:06 +00005582 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5583
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005584 { NULL, NULL }
5585};
5586
Guido van Rossum60456fd1997-04-09 17:36:32 +00005587static int
Tim Peterscba30e22003-02-01 06:24:36 +00005588init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005589{
5590 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005591
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00005592#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005593
Tim Peters3cfe7542003-05-21 21:29:48 +00005594 if (PyType_Ready(&Unpicklertype) < 0)
5595 return -1;
5596 if (PyType_Ready(&Picklertype) < 0)
5597 return -1;
5598
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005599 INIT_STR(__class__);
5600 INIT_STR(__getinitargs__);
5601 INIT_STR(__dict__);
5602 INIT_STR(__getstate__);
5603 INIT_STR(__setstate__);
5604 INIT_STR(__name__);
5605 INIT_STR(__main__);
5606 INIT_STR(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00005607 INIT_STR(__reduce_ex__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005608 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005609 INIT_STR(append);
5610 INIT_STR(read);
5611 INIT_STR(readline);
5612 INIT_STR(copy_reg);
5613 INIT_STR(dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005614
Tim Peterscba30e22003-02-01 06:24:36 +00005615 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005616 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005617
Tim Peters1f1b2d22003-02-01 02:16:37 +00005618 /* This is special because we want to use a different
5619 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005620 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005621 if (!dispatch_table) return -1;
5622
5623 extension_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005624 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005625 if (!extension_registry) return -1;
5626
5627 inverted_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005628 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005629 if (!inverted_registry) return -1;
5630
5631 extension_cache = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005632 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005633 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005634
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005635 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005636
Tim Peters731098b2003-02-04 20:56:09 +00005637 if (!(empty_tuple = PyTuple_New(0)))
5638 return -1;
5639
5640 two_tuple = PyTuple_New(2);
5641 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005642 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005643 /* We use this temp container with no regard to refcounts, or to
5644 * keeping containees alive. Exempt from GC, because we don't
5645 * want anything looking at two_tuple() by magic.
5646 */
5647 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005648
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005649 /* Ugh */
5650 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5651 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5652 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005654 if (!( t=PyDict_New())) return -1;
5655 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005656 "def __str__(self):\n"
5657 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5658 Py_file_input,
5659 module_dict, t) )) return -1;
5660 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005662 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005663 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005664 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005665
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005666 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005667
Tim Peterscba30e22003-02-01 06:24:36 +00005668 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005669 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005670 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005671 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005672
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005673 if (!( t=PyDict_New())) return -1;
5674 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005675 "def __str__(self):\n"
5676 " a=self.args\n"
5677 " a=a and type(a[0]) or '(what)'\n"
5678 " return 'Cannot pickle %s objects' % a\n"
5679 , Py_file_input,
5680 module_dict, t) )) return -1;
5681 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005683 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005684 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005685 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005686
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005687 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005689 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005690 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005691 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005692
Martin v. Löwis658009a2002-09-16 17:26:24 +00005693 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5694 UnpicklingError, NULL)))
5695 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005696
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005697 if (PyDict_SetItemString(module_dict, "PickleError",
5698 PickleError) < 0)
5699 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005700
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005701 if (PyDict_SetItemString(module_dict, "PicklingError",
5702 PicklingError) < 0)
5703 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005705 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5706 UnpicklingError) < 0)
5707 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005708
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005709 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5710 UnpickleableError) < 0)
5711 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005713 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5714 BadPickleGet) < 0)
5715 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005716
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005717 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005718
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005719 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005720}
5721
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005722#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5723#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005724#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005725PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005726initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005727{
5728 PyObject *m, *d, *di, *v, *k;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005729 Py_ssize_t i;
Tim Peters5b7da392003-02-04 00:21:07 +00005730 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005731 PyObject *format_version;
5732 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005733
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005734 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005735 Unpicklertype.ob_type = &PyType_Type;
5736 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005738 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005739 * so we're forced to use a temporary dictionary. :(
5740 */
5741 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005742 if (!di) return;
5743 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005745 /* Create the module and add the functions */
5746 m = Py_InitModule4("cPickle", cPickle_methods,
5747 cPickle_module_documentation,
5748 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00005749 if (m == NULL)
5750 return;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005751
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005752 /* Add some symbolic constants to the module */
5753 d = PyModule_GetDict(m);
Tim Peters5b7da392003-02-04 00:21:07 +00005754 v = PyString_FromString(rev);
5755 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005756 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005758 /* Copy data from di. Waaa. */
5759 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5760 if (PyObject_SetItem(d, k, v) < 0) {
5761 Py_DECREF(di);
5762 return;
5763 }
5764 }
5765 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005766
Tim Peters8587b3c2003-02-13 15:44:41 +00005767 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
5768 if (i < 0)
5769 return;
5770
Tim Peters5b7da392003-02-04 00:21:07 +00005771 /* These are purely informational; no code uses them. */
5772 /* File format version we write. */
5773 format_version = PyString_FromString("2.0");
5774 /* Format versions we can read. */
5775 compatible_formats = Py_BuildValue("[sssss]",
5776 "1.0", /* Original protocol 0 */
5777 "1.1", /* Protocol 0 + INST */
5778 "1.2", /* Original protocol 1 */
5779 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005780 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005781 PyDict_SetItemString(d, "format_version", format_version);
5782 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5783 Py_XDECREF(format_version);
5784 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005785}