blob: 4f7d1f198afb84edd1f5eb815d8def0220b22861 [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) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000536 self->buf = (char *)realloc(self->buf, n);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000537 if (!self->buf) {
538 PyErr_NoMemory();
539 return -1;
540 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000541 self->buf_size = n;
542 }
Tim Peters84e87f32001-03-17 04:50:51 +0000543
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000544 Py_BEGIN_ALLOW_THREADS
545 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
546 Py_END_ALLOW_THREADS
547 if (nbytesread != (size_t)n) {
548 if (feof(self->fp)) {
549 PyErr_SetNone(PyExc_EOFError);
550 return -1;
551 }
Tim Peterscba30e22003-02-01 06:24:36 +0000552
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000553 PyErr_SetFromErrno(PyExc_IOError);
554 return -1;
555 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000556
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000557 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000558
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000559 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000560}
561
562
Martin v. Löwis18e16552006-02-15 17:27:45 +0000563static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000564readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000565{
566 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000567
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000568 if (self->buf_size == 0) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000569 if (!( self->buf = (char *)malloc(40))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000570 PyErr_NoMemory();
571 return -1;
572 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000573 self->buf_size = 40;
574 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000575
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000576 i = 0;
577 while (1) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000578 int bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000579 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000580 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000581 (self->buf[i] = getc(self->fp)) == '\n') {
582 self->buf[i + 1] = '\0';
583 *s = self->buf;
584 return i + 1;
585 }
586 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000587 bigger = self->buf_size << 1;
588 if (bigger <= 0) { /* overflow */
589 PyErr_NoMemory();
590 return -1;
591 }
592 self->buf = (char *)realloc(self->buf, bigger);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000593 if (!self->buf) {
594 PyErr_NoMemory();
595 return -1;
596 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000597 self->buf_size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000598 }
Tim Peters84e87f32001-03-17 04:50:51 +0000599}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000600
601
Martin v. Löwis18e16552006-02-15 17:27:45 +0000602static Py_ssize_t
603read_cStringIO(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000604{
605 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000607 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
608 PyErr_SetNone(PyExc_EOFError);
609 return -1;
610 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000612 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000613
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000614 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000615}
616
617
Martin v. Löwis18e16552006-02-15 17:27:45 +0000618static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000619readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000620{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000621 Py_ssize_t n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000622 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000623
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000624 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
625 return -1;
626 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000628 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000629
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000630 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000631}
632
633
Martin v. Löwis18e16552006-02-15 17:27:45 +0000634static Py_ssize_t
635read_other(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000636{
637 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000638
Martin v. Löwis18e16552006-02-15 17:27:45 +0000639 if (!( bytes = PyInt_FromSsize_t(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000640
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000641 ARG_TUP(self, bytes);
642 if (self->arg) {
643 str = PyObject_Call(self->read, self->arg, NULL);
644 FREE_ARG_TUP(self);
645 }
646 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000647
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000648 Py_XDECREF(self->last_string);
649 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000651 if (! (*s = PyString_AsString(str))) return -1;
652 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000653}
654
655
Martin v. Löwis18e16552006-02-15 17:27:45 +0000656static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000657readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000658{
659 PyObject *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000660 Py_ssize_t str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000662 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
663 return -1;
664 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000665
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000666 if ((str_size = PyString_Size(str)) < 0)
667 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000669 Py_XDECREF(self->last_string);
670 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000672 if (! (*s = PyString_AsString(str)))
673 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000675 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000676}
677
Tim Petersee1a53c2003-02-02 02:57:53 +0000678/* Copy the first n bytes from s into newly malloc'ed memory, plus a
679 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
680 * The caller is responsible for free()'ing the return value.
681 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000682static char *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000683pystrndup(const char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000684{
Tim Petersee1a53c2003-02-02 02:57:53 +0000685 char *r = (char *)malloc(n+1);
686 if (r == NULL)
687 return (char*)PyErr_NoMemory();
688 memcpy(r, s, n);
689 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000690 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000691}
692
693
694static int
Tim Peterscba30e22003-02-01 06:24:36 +0000695get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000696{
697 PyObject *value, *mv;
698 long c_value;
699 char s[30];
700 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000701
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000702 if (!( mv = PyDict_GetItem(self->memo, id))) {
703 PyErr_SetObject(PyExc_KeyError, id);
704 return -1;
705 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000706
Tim Peterscba30e22003-02-01 06:24:36 +0000707 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000708 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000710 if (!( PyInt_Check(value))) {
711 PyErr_SetString(PicklingError, "no int where int expected in memo");
712 return -1;
713 }
714 c_value = PyInt_AS_LONG((PyIntObject*)value);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000716 if (!self->bin) {
717 s[0] = GET;
718 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
719 len = strlen(s);
720 }
721 else if (Pdata_Check(self->file)) {
722 if (write_other(self, NULL, 0) < 0) return -1;
723 PDATA_APPEND(self->file, mv, -1);
724 return 0;
725 }
726 else {
727 if (c_value < 256) {
728 s[0] = BINGET;
729 s[1] = (int)(c_value & 0xff);
730 len = 2;
731 }
732 else {
733 s[0] = LONG_BINGET;
734 s[1] = (int)(c_value & 0xff);
735 s[2] = (int)((c_value >> 8) & 0xff);
736 s[3] = (int)((c_value >> 16) & 0xff);
737 s[4] = (int)((c_value >> 24) & 0xff);
738 len = 5;
739 }
740 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000741
Tim Peters0bc93f52003-02-02 18:29:33 +0000742 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000743 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000744
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000745 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000746}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000747
Guido van Rossum60456fd1997-04-09 17:36:32 +0000748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000749static int
Tim Peterscba30e22003-02-01 06:24:36 +0000750put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000751{
Tim Peterscba30e22003-02-01 06:24:36 +0000752 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000753 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000754
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000755 return put2(self, ob);
756}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000757
Guido van Rossum053b8df1998-11-25 16:18:00 +0000758
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000759static int
Tim Peterscba30e22003-02-01 06:24:36 +0000760put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000761{
762 char c_str[30];
763 int p;
764 size_t len;
765 int res = -1;
766 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000767
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000768 if (self->fast)
769 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000770
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000771 if ((p = PyDict_Size(self->memo)) < 0)
772 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000774 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000775 /* XXX Why?
776 * XXX And does "positive" really mean non-negative?
777 * XXX pickle.py starts with PUT index 0, not 1. This makes for
778 * XXX gratuitous differences between the pickling modules.
779 */
Tim Peterscba30e22003-02-01 06:24:36 +0000780 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000781
Tim Peterscba30e22003-02-01 06:24:36 +0000782 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000783 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000784
Tim Peterscba30e22003-02-01 06:24:36 +0000785 if (!( memo_len = PyInt_FromLong(p)))
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 (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000789 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000790
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000791 PyTuple_SET_ITEM(t, 0, memo_len);
792 Py_INCREF(memo_len);
793 PyTuple_SET_ITEM(t, 1, ob);
794 Py_INCREF(ob);
795
796 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
797 goto finally;
798
799 if (!self->bin) {
800 c_str[0] = PUT;
801 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
802 len = strlen(c_str);
803 }
804 else if (Pdata_Check(self->file)) {
805 if (write_other(self, NULL, 0) < 0) return -1;
806 PDATA_APPEND(self->file, memo_len, -1);
807 res=0; /* Job well done ;) */
808 goto finally;
809 }
810 else {
811 if (p >= 256) {
812 c_str[0] = LONG_BINPUT;
813 c_str[1] = (int)(p & 0xff);
814 c_str[2] = (int)((p >> 8) & 0xff);
815 c_str[3] = (int)((p >> 16) & 0xff);
816 c_str[4] = (int)((p >> 24) & 0xff);
817 len = 5;
818 }
819 else {
820 c_str[0] = BINPUT;
821 c_str[1] = p;
822 len = 2;
823 }
824 }
825
Tim Peters0bc93f52003-02-02 18:29:33 +0000826 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000827 goto finally;
828
829 res = 0;
830
831 finally:
832 Py_XDECREF(py_ob_id);
833 Py_XDECREF(memo_len);
834 Py_XDECREF(t);
835
836 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000837}
838
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000839static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000840whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000841{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000842 Py_ssize_t i, j;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000843 PyObject *module = 0, *modules_dict = 0,
844 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000846 module = PyObject_GetAttrString(global, "__module__");
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000847 if (module)
848 return module;
849 if (PyErr_ExceptionMatches(PyExc_AttributeError))
850 PyErr_Clear();
851 else
852 return NULL;
Guido van Rossum45188231997-09-28 05:38:51 +0000853
Tim Peterscba30e22003-02-01 06:24:36 +0000854 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000855 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000857 i = 0;
858 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000859
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000860 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000862 global_name_attr = PyObject_GetAttr(module, global_name);
863 if (!global_name_attr) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000864 if (PyErr_ExceptionMatches(PyExc_AttributeError))
865 PyErr_Clear();
866 else
867 return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000868 continue;
869 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000870
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000871 if (global_name_attr != global) {
872 Py_DECREF(global_name_attr);
873 continue;
874 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000876 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000877
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000878 break;
879 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000880
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000881 /* The following implements the rule in pickle.py added in 1.5
882 that used __main__ if no module is found. I don't actually
883 like this rule. jlf
884 */
885 if (!j) {
886 j=1;
887 name=__main___str;
888 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000889
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000890 Py_INCREF(name);
891 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000892}
893
894
Guido van Rossum60456fd1997-04-09 17:36:32 +0000895static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000896fast_save_enter(Picklerobject *self, PyObject *obj)
897{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000898 /* if fast_container < 0, we're doing an error exit. */
899 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
900 PyObject *key = NULL;
901 if (self->fast_memo == NULL) {
902 self->fast_memo = PyDict_New();
903 if (self->fast_memo == NULL) {
904 self->fast_container = -1;
905 return 0;
906 }
907 }
908 key = PyLong_FromVoidPtr(obj);
909 if (key == NULL)
910 return 0;
911 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000912 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000913 PyErr_Format(PyExc_ValueError,
Tim Peters92c8bb32003-02-13 23:00:26 +0000914 "fast mode: can't pickle cyclic objects "
915 "including object type %s at %p",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000916 obj->ob_type->tp_name, obj);
917 self->fast_container = -1;
918 return 0;
919 }
920 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000921 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000922 self->fast_container = -1;
923 return 0;
924 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000925 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000926 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000927 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000928}
929
Tim Peterscba30e22003-02-01 06:24:36 +0000930int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000931fast_save_leave(Picklerobject *self, PyObject *obj)
932{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000933 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
934 PyObject *key = PyLong_FromVoidPtr(obj);
935 if (key == NULL)
936 return 0;
937 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000938 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000939 return 0;
940 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000941 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000942 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000943 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000944}
945
946static int
Tim Peterscba30e22003-02-01 06:24:36 +0000947save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000948{
949 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000950 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000951 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000953 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000954}
955
Guido van Rossum77f6a652002-04-03 22:41:51 +0000956static int
Tim Peterscba30e22003-02-01 06:24:36 +0000957save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000958{
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000959 static const char *buf[2] = {FALSE, TRUE};
Guido van Rossume2763392002-04-05 19:30:08 +0000960 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossum77f6a652002-04-03 22:41:51 +0000961 long l = PyInt_AS_LONG((PyIntObject *)args);
962
Tim Peters3c67d792003-02-02 17:59:11 +0000963 if (self->proto >= 2) {
964 char opcode = l ? NEWTRUE : NEWFALSE;
965 if (self->write_func(self, &opcode, 1) < 0)
966 return -1;
967 }
968 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000969 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000970 return 0;
971}
Tim Peters84e87f32001-03-17 04:50:51 +0000972
Guido van Rossum60456fd1997-04-09 17:36:32 +0000973static int
Tim Peterscba30e22003-02-01 06:24:36 +0000974save_int(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000975{
976 char c_str[32];
977 long l = PyInt_AS_LONG((PyIntObject *)args);
978 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000979
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000980 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000981#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000982 || l > 0x7fffffffL
983 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000984#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000985 ) {
986 /* Text-mode pickle, or long too big to fit in the 4-byte
987 * signed BININT format: store as a string.
988 */
989 c_str[0] = INT;
990 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +0000991 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000992 return -1;
993 }
994 else {
995 /* Binary pickle and l fits in a signed 4-byte int. */
996 c_str[1] = (int)( l & 0xff);
997 c_str[2] = (int)((l >> 8) & 0xff);
998 c_str[3] = (int)((l >> 16) & 0xff);
999 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001001 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1002 if (c_str[2] == 0) {
1003 c_str[0] = BININT1;
1004 len = 2;
1005 }
1006 else {
1007 c_str[0] = BININT2;
1008 len = 3;
1009 }
1010 }
1011 else {
1012 c_str[0] = BININT;
1013 len = 5;
1014 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001015
Tim Peters0bc93f52003-02-02 18:29:33 +00001016 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001017 return -1;
1018 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001019
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001020 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001021}
1022
1023
1024static int
Tim Peterscba30e22003-02-01 06:24:36 +00001025save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001026{
Armin Rigo7ccbca92006-10-04 12:17:45 +00001027 Py_ssize_t size;
Tim Petersee1a53c2003-02-02 02:57:53 +00001028 int res = -1;
1029 PyObject *repr = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001030
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001031 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001032
Tim Petersee1a53c2003-02-02 02:57:53 +00001033 if (self->proto >= 2) {
1034 /* Linear-time pickling. */
1035 size_t nbits;
1036 size_t nbytes;
1037 unsigned char *pdata;
1038 char c_str[5];
1039 int i;
1040 int sign = _PyLong_Sign(args);
1041
1042 if (sign == 0) {
1043 /* It's 0 -- an empty bytestring. */
1044 c_str[0] = LONG1;
1045 c_str[1] = 0;
1046 i = self->write_func(self, c_str, 2);
1047 if (i < 0) goto finally;
1048 res = 0;
1049 goto finally;
1050 }
1051 nbits = _PyLong_NumBits(args);
1052 if (nbits == (size_t)-1 && PyErr_Occurred())
1053 goto finally;
1054 /* How many bytes do we need? There are nbits >> 3 full
1055 * bytes of data, and nbits & 7 leftover bits. If there
1056 * are any leftover bits, then we clearly need another
1057 * byte. Wnat's not so obvious is that we *probably*
1058 * need another byte even if there aren't any leftovers:
1059 * the most-significant bit of the most-significant byte
1060 * acts like a sign bit, and it's usually got a sense
1061 * opposite of the one we need. The exception is longs
1062 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1063 * its own 256's-complement, so has the right sign bit
1064 * even without the extra byte. That's a pain to check
1065 * for in advance, though, so we always grab an extra
1066 * byte at the start, and cut it back later if possible.
1067 */
1068 nbytes = (nbits >> 3) + 1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001069 if (nbytes > INT_MAX) {
Tim Petersee1a53c2003-02-02 02:57:53 +00001070 PyErr_SetString(PyExc_OverflowError, "long too large "
1071 "to pickle");
1072 goto finally;
1073 }
1074 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
1075 if (repr == NULL) goto finally;
1076 pdata = (unsigned char *)PyString_AS_STRING(repr);
1077 i = _PyLong_AsByteArray((PyLongObject *)args,
1078 pdata, nbytes,
1079 1 /* little endian */, 1 /* signed */);
1080 if (i < 0) goto finally;
1081 /* If the long is negative, this may be a byte more than
1082 * needed. This is so iff the MSB is all redundant sign
1083 * bits.
1084 */
1085 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1086 (pdata[nbytes - 2] & 0x80) != 0)
1087 --nbytes;
1088
1089 if (nbytes < 256) {
1090 c_str[0] = LONG1;
1091 c_str[1] = (char)nbytes;
1092 size = 2;
1093 }
1094 else {
1095 c_str[0] = LONG4;
1096 size = (int)nbytes;
1097 for (i = 1; i < 5; i++) {
1098 c_str[i] = (char)(size & 0xff);
1099 size >>= 8;
1100 }
1101 size = 5;
1102 }
1103 i = self->write_func(self, c_str, size);
1104 if (i < 0) goto finally;
1105 i = self->write_func(self, (char *)pdata, (int)nbytes);
1106 if (i < 0) goto finally;
1107 res = 0;
1108 goto finally;
1109 }
1110
1111 /* proto < 2: write the repr and newline. This is quadratic-time
1112 * (in the number of digits), in both directions.
1113 */
Tim Peterscba30e22003-02-01 06:24:36 +00001114 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001115 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001117 if ((size = PyString_Size(repr)) < 0)
1118 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001119
Tim Peters0bc93f52003-02-02 18:29:33 +00001120 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001121 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001122
Tim Peters0bc93f52003-02-02 18:29:33 +00001123 if (self->write_func(self,
1124 PyString_AS_STRING((PyStringObject *)repr),
1125 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001126 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001127
Tim Peters0bc93f52003-02-02 18:29:33 +00001128 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001129 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001131 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001133 finally:
1134 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001135 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001136}
1137
1138
1139static int
Tim Peterscba30e22003-02-01 06:24:36 +00001140save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001141{
1142 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001144 if (self->bin) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001145 char str[9];
Tim Peters9905b942003-03-20 20:53:32 +00001146 str[0] = BINFLOAT;
1147 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001148 return -1;
Tim Peters0bc93f52003-02-02 18:29:33 +00001149 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001150 return -1;
1151 }
1152 else {
1153 char c_str[250];
1154 c_str[0] = FLOAT;
Georg Brandlde9b6242006-04-30 11:13:56 +00001155 PyOS_ascii_formatd(c_str + 1, sizeof(c_str) - 2, "%.17g", x);
1156 /* Extend the formatted string with a newline character */
1157 strcat(c_str, "\n");
Guido van Rossum60456fd1997-04-09 17:36:32 +00001158
Tim Peters0bc93f52003-02-02 18:29:33 +00001159 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001160 return -1;
1161 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001163 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001164}
1165
1166
1167static int
Tim Peterscba30e22003-02-01 06:24:36 +00001168save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001169{
1170 int size, len;
1171 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001173 if ((size = PyString_Size(args)) < 0)
1174 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001175
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001176 if (!self->bin) {
1177 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001179 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001180
Tim Peterscba30e22003-02-01 06:24:36 +00001181 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001182 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001184 if ((len = PyString_Size(repr)) < 0)
1185 goto err;
1186 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001187
Tim Peters0bc93f52003-02-02 18:29:33 +00001188 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001189 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001190
Tim Peters0bc93f52003-02-02 18:29:33 +00001191 if (self->write_func(self, repr_str, len) < 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, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001195 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001197 Py_XDECREF(repr);
1198 }
1199 else {
1200 int i;
1201 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001203 if ((size = PyString_Size(args)) < 0)
1204 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001206 if (size < 256) {
1207 c_str[0] = SHORT_BINSTRING;
1208 c_str[1] = size;
1209 len = 2;
1210 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00001211 else if (size <= INT_MAX) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001212 c_str[0] = BINSTRING;
1213 for (i = 1; i < 5; i++)
1214 c_str[i] = (int)(size >> ((i - 1) * 8));
1215 len = 5;
1216 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00001217 else
1218 return -1; /* string too large */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001219
Tim Peters0bc93f52003-02-02 18:29:33 +00001220 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001221 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001222
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001223 if (size > 128 && Pdata_Check(self->file)) {
1224 if (write_other(self, NULL, 0) < 0) return -1;
1225 PDATA_APPEND(self->file, args, -1);
1226 }
1227 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001228 if (self->write_func(self,
1229 PyString_AS_STRING(
1230 (PyStringObject *)args),
1231 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001232 return -1;
1233 }
1234 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001235
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001236 if (doput)
1237 if (put(self, args) < 0)
1238 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001239
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001240 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001241
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001242 err:
1243 Py_XDECREF(repr);
1244 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001245}
1246
1247
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001248#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001249/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1250 backslash and newline characters to \uXXXX escapes. */
1251static PyObject *
1252modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1253{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001254 PyObject *repr;
1255 char *p;
1256 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001257
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001258 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001259
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001260 repr = PyString_FromStringAndSize(NULL, 6 * size);
1261 if (repr == NULL)
1262 return NULL;
1263 if (size == 0)
1264 return repr;
1265
1266 p = q = PyString_AS_STRING(repr);
1267 while (size-- > 0) {
1268 Py_UNICODE ch = *s++;
1269 /* Map 16-bit characters to '\uxxxx' */
1270 if (ch >= 256 || ch == '\\' || ch == '\n') {
1271 *p++ = '\\';
1272 *p++ = 'u';
1273 *p++ = hexdigit[(ch >> 12) & 0xf];
1274 *p++ = hexdigit[(ch >> 8) & 0xf];
1275 *p++ = hexdigit[(ch >> 4) & 0xf];
1276 *p++ = hexdigit[ch & 15];
1277 }
1278 /* Copy everything else as-is */
1279 else
1280 *p++ = (char) ch;
1281 }
1282 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001283 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001284 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001285}
1286
1287
Guido van Rossum60456fd1997-04-09 17:36:32 +00001288static int
Tim Peterscba30e22003-02-01 06:24:36 +00001289save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001290{
Armin Rigo7ccbca92006-10-04 12:17:45 +00001291 Py_ssize_t size, len;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001292 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001294 if (!PyUnicode_Check(args))
1295 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001297 if (!self->bin) {
1298 char *repr_str;
1299 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001300
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001301 repr = modified_EncodeRawUnicodeEscape(
1302 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001303 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001304 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001305
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001306 if ((len = PyString_Size(repr)) < 0)
1307 goto err;
1308 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001309
Tim Peters0bc93f52003-02-02 18:29:33 +00001310 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001311 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001312
Tim Peters0bc93f52003-02-02 18:29:33 +00001313 if (self->write_func(self, repr_str, len) < 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, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001317 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001318
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001319 Py_XDECREF(repr);
1320 }
1321 else {
1322 int i;
1323 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001324
Tim Peterscba30e22003-02-01 06:24:36 +00001325 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001326 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001327
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001328 if ((size = PyString_Size(repr)) < 0)
1329 goto err;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001330 if (size > INT_MAX)
1331 return -1; /* string too large */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001332
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001333 c_str[0] = BINUNICODE;
1334 for (i = 1; i < 5; i++)
1335 c_str[i] = (int)(size >> ((i - 1) * 8));
1336 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001337
Tim Peters0bc93f52003-02-02 18:29:33 +00001338 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001339 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001341 if (size > 128 && Pdata_Check(self->file)) {
1342 if (write_other(self, NULL, 0) < 0)
1343 goto err;
1344 PDATA_APPEND(self->file, repr, -1);
1345 }
1346 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001347 if (self->write_func(self, PyString_AS_STRING(repr),
1348 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001349 goto err;
1350 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001351
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001352 Py_DECREF(repr);
1353 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001355 if (doput)
1356 if (put(self, args) < 0)
1357 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001358
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001359 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001361 err:
1362 Py_XDECREF(repr);
1363 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001364}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001365#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001366
Tim Peters1d63c9f2003-02-02 20:29:39 +00001367/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1368static int
Tim Peters67920142003-02-05 03:46:17 +00001369store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001370{
1371 int i;
1372 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001373
Tim Peters1d63c9f2003-02-02 20:29:39 +00001374 assert(PyTuple_Size(t) == len);
1375
1376 for (i = 0; i < len; i++) {
1377 PyObject *element = PyTuple_GET_ITEM(t, i);
1378
1379 if (element == NULL)
1380 goto finally;
1381 if (save(self, element, 0) < 0)
1382 goto finally;
1383 }
1384 res = 0;
1385
1386 finally:
1387 return res;
1388}
1389
1390/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1391 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001392 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001393 * (a tuple can be reached from itself), and that requires some subtle
1394 * magic so that it works in all cases. IOW, this is a long routine.
1395 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001396static int
Tim Peterscba30e22003-02-01 06:24:36 +00001397save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001398{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001399 PyObject *py_tuple_id = NULL;
1400 int len, i;
1401 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001403 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001404 static char pop = POP;
1405 static char pop_mark = POP_MARK;
1406 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001408 if ((len = PyTuple_Size(args)) < 0)
1409 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001410
Tim Peters1d63c9f2003-02-02 20:29:39 +00001411 if (len == 0) {
1412 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001413
Tim Peters1d63c9f2003-02-02 20:29:39 +00001414 if (self->proto) {
1415 c_str[0] = EMPTY_TUPLE;
1416 len = 1;
1417 }
1418 else {
1419 c_str[0] = MARK;
1420 c_str[1] = TUPLE;
1421 len = 2;
1422 }
1423 if (self->write_func(self, c_str, len) >= 0)
1424 res = 0;
1425 /* Don't memoize an empty tuple. */
1426 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001427 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001428
Tim Peters1d63c9f2003-02-02 20:29:39 +00001429 /* A non-empty tuple. */
1430
1431 /* id(tuple) isn't in the memo now. If it shows up there after
1432 * saving the tuple elements, the tuple must be recursive, in
1433 * which case we'll pop everything we put on the stack, and fetch
1434 * its value from the memo.
1435 */
1436 py_tuple_id = PyLong_FromVoidPtr(args);
1437 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001438 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001439
Tim Peters1d63c9f2003-02-02 20:29:39 +00001440 if (len <= 3 && self->proto >= 2) {
1441 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001442 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001443 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001444 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001445 /* pop the len elements */
1446 for (i = 0; i < len; ++i)
1447 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001448 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001449 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001450 if (get(self, py_tuple_id) < 0)
1451 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001452 res = 0;
1453 goto finally;
1454 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001455 /* Not recursive. */
1456 if (self->write_func(self, len2opcode + len, 1) < 0)
1457 goto finally;
1458 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001459 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001460
Tim Peters1d63c9f2003-02-02 20:29:39 +00001461 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1462 * Generate MARK elt1 elt2 ... TUPLE
1463 */
1464 if (self->write_func(self, &MARKv, 1) < 0)
1465 goto finally;
1466
Tim Peters67920142003-02-05 03:46:17 +00001467 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001468 goto finally;
1469
1470 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1471 /* pop the stack stuff we pushed */
1472 if (self->bin) {
1473 if (self->write_func(self, &pop_mark, 1) < 0)
1474 goto finally;
1475 }
1476 else {
1477 /* Note that we pop one more than len, to remove
1478 * the MARK too.
1479 */
1480 for (i = 0; i <= len; i++)
1481 if (self->write_func(self, &pop, 1) < 0)
1482 goto finally;
1483 }
1484 /* fetch from memo */
1485 if (get(self, py_tuple_id) >= 0)
1486 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001487 goto finally;
1488 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001489
Tim Peters1d63c9f2003-02-02 20:29:39 +00001490 /* Not recursive. */
1491 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001492 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001493
Tim Peters1d63c9f2003-02-02 20:29:39 +00001494 memoize:
1495 if (put(self, args) >= 0)
1496 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001497
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001498 finally:
1499 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001500 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001501}
1502
Tim Peters1092d642003-02-11 21:06:20 +00001503/* iter is an iterator giving items, and we batch up chunks of
1504 * MARK item item ... item APPENDS
1505 * opcode sequences. Calling code should have arranged to first create an
1506 * empty list, or list-like object, for the APPENDS to operate on.
1507 * Returns 0 on success, <0 on error.
1508 */
1509static int
1510batch_list(Picklerobject *self, PyObject *iter)
1511{
1512 PyObject *obj;
1513 PyObject *slice[BATCHSIZE];
1514 int i, n;
1515
1516 static char append = APPEND;
1517 static char appends = APPENDS;
1518
1519 assert(iter != NULL);
1520
1521 if (self->proto == 0) {
1522 /* APPENDS isn't available; do one at a time. */
1523 for (;;) {
1524 obj = PyIter_Next(iter);
1525 if (obj == NULL) {
1526 if (PyErr_Occurred())
1527 return -1;
1528 break;
1529 }
1530 i = save(self, obj, 0);
1531 Py_DECREF(obj);
1532 if (i < 0)
1533 return -1;
1534 if (self->write_func(self, &append, 1) < 0)
1535 return -1;
Tim Peters1092d642003-02-11 21:06:20 +00001536 }
1537 return 0;
1538 }
1539
1540 /* proto > 0: write in batches of BATCHSIZE. */
1541 do {
1542 /* Get next group of (no more than) BATCHSIZE elements. */
1543 for (n = 0; n < BATCHSIZE; ++n) {
1544 obj = PyIter_Next(iter);
1545 if (obj == NULL) {
1546 if (PyErr_Occurred())
1547 goto BatchFailed;
1548 break;
1549 }
1550 slice[n] = obj;
1551 }
1552
1553 if (n > 1) {
1554 /* Pump out MARK, slice[0:n], APPENDS. */
1555 if (self->write_func(self, &MARKv, 1) < 0)
1556 goto BatchFailed;
1557 for (i = 0; i < n; ++i) {
1558 if (save(self, slice[i], 0) < 0)
1559 goto BatchFailed;
1560 }
1561 if (self->write_func(self, &appends, 1) < 0)
1562 goto BatchFailed;
1563 }
1564 else if (n == 1) {
1565 if (save(self, slice[0], 0) < 0)
1566 goto BatchFailed;
1567 if (self->write_func(self, &append, 1) < 0)
1568 goto BatchFailed;
1569 }
1570
1571 for (i = 0; i < n; ++i) {
1572 Py_DECREF(slice[i]);
1573 }
Tim Peters90975f12003-02-12 05:28:58 +00001574 } while (n == BATCHSIZE);
Tim Peters1092d642003-02-11 21:06:20 +00001575 return 0;
1576
1577BatchFailed:
1578 while (--n >= 0) {
1579 Py_DECREF(slice[n]);
1580 }
1581 return -1;
1582}
1583
Guido van Rossum60456fd1997-04-09 17:36:32 +00001584static int
Tim Peterscba30e22003-02-01 06:24:36 +00001585save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001586{
Tim Peters1092d642003-02-11 21:06:20 +00001587 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001588 char s[3];
Tim Peters1092d642003-02-11 21:06:20 +00001589 int len;
1590 PyObject *iter;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001591
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001592 if (self->fast && !fast_save_enter(self, args))
1593 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001594
Tim Peters1092d642003-02-11 21:06:20 +00001595 /* Create an empty list. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001596 if (self->bin) {
1597 s[0] = EMPTY_LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001598 len = 1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001599 }
1600 else {
1601 s[0] = MARK;
1602 s[1] = LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001603 len = 2;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001604 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001605
Tim Peters1092d642003-02-11 21:06:20 +00001606 if (self->write_func(self, s, len) < 0)
1607 goto finally;
1608
1609 /* Get list length, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001610 if ((len = PyList_Size(args)) < 0)
1611 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001612
Tim Peters1092d642003-02-11 21:06:20 +00001613 /* Memoize. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001614 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001615 if (put(self, args) >= 0)
1616 res = 0;
1617 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001618 }
Tim Peters90975f12003-02-12 05:28:58 +00001619 if (put2(self, args) < 0)
1620 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001621
Tim Peters1092d642003-02-11 21:06:20 +00001622 /* Materialize the list elements. */
1623 iter = PyObject_GetIter(args);
1624 if (iter == NULL)
1625 goto finally;
1626 res = batch_list(self, iter);
1627 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001628
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001629 finally:
1630 if (self->fast && !fast_save_leave(self, args))
1631 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001632
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001633 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001634}
1635
1636
Tim Peters42f08ac2003-02-11 22:43:24 +00001637/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1638 * MARK key value ... key value SETITEMS
1639 * opcode sequences. Calling code should have arranged to first create an
1640 * empty dict, or dict-like object, for the SETITEMS to operate on.
1641 * Returns 0 on success, <0 on error.
1642 *
1643 * This is very much like batch_list(). The difference between saving
1644 * elements directly, and picking apart two-tuples, is so long-winded at
1645 * the C level, though, that attempts to combine these routines were too
1646 * ugly to bear.
1647 */
1648static int
1649batch_dict(Picklerobject *self, PyObject *iter)
1650{
1651 PyObject *p;
1652 PyObject *slice[BATCHSIZE];
1653 int i, n;
1654
1655 static char setitem = SETITEM;
1656 static char setitems = SETITEMS;
1657
1658 assert(iter != NULL);
1659
1660 if (self->proto == 0) {
1661 /* SETITEMS isn't available; do one at a time. */
1662 for (;;) {
1663 p = PyIter_Next(iter);
1664 if (p == NULL) {
1665 if (PyErr_Occurred())
1666 return -1;
1667 break;
1668 }
1669 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1670 PyErr_SetString(PyExc_TypeError, "dict items "
1671 "iterator must return 2-tuples");
1672 return -1;
1673 }
1674 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1675 if (i >= 0)
1676 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1677 Py_DECREF(p);
1678 if (i < 0)
1679 return -1;
1680 if (self->write_func(self, &setitem, 1) < 0)
1681 return -1;
Tim Peters42f08ac2003-02-11 22:43:24 +00001682 }
1683 return 0;
1684 }
1685
1686 /* proto > 0: write in batches of BATCHSIZE. */
1687 do {
1688 /* Get next group of (no more than) BATCHSIZE elements. */
1689 for (n = 0; n < BATCHSIZE; ++n) {
1690 p = PyIter_Next(iter);
1691 if (p == NULL) {
1692 if (PyErr_Occurred())
1693 goto BatchFailed;
1694 break;
1695 }
1696 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1697 PyErr_SetString(PyExc_TypeError, "dict items "
1698 "iterator must return 2-tuples");
1699 goto BatchFailed;
1700 }
1701 slice[n] = p;
1702 }
1703
1704 if (n > 1) {
1705 /* Pump out MARK, slice[0:n], SETITEMS. */
1706 if (self->write_func(self, &MARKv, 1) < 0)
1707 goto BatchFailed;
1708 for (i = 0; i < n; ++i) {
1709 p = slice[i];
1710 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1711 goto BatchFailed;
1712 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1713 goto BatchFailed;
1714 }
1715 if (self->write_func(self, &setitems, 1) < 0)
1716 goto BatchFailed;
1717 }
1718 else if (n == 1) {
1719 p = slice[0];
1720 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1721 goto BatchFailed;
1722 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1723 goto BatchFailed;
1724 if (self->write_func(self, &setitem, 1) < 0)
1725 goto BatchFailed;
1726 }
1727
1728 for (i = 0; i < n; ++i) {
1729 Py_DECREF(slice[i]);
1730 }
Tim Peters90975f12003-02-12 05:28:58 +00001731 } while (n == BATCHSIZE);
Tim Peters42f08ac2003-02-11 22:43:24 +00001732 return 0;
1733
1734BatchFailed:
1735 while (--n >= 0) {
1736 Py_DECREF(slice[n]);
1737 }
1738 return -1;
1739}
1740
Guido van Rossum60456fd1997-04-09 17:36:32 +00001741static int
Tim Peterscba30e22003-02-01 06:24:36 +00001742save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001743{
Tim Peters42f08ac2003-02-11 22:43:24 +00001744 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001745 char s[3];
Tim Peters42f08ac2003-02-11 22:43:24 +00001746 int len;
1747 PyObject *iter;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001749 if (self->fast && !fast_save_enter(self, args))
1750 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001751
Tim Peters42f08ac2003-02-11 22:43:24 +00001752 /* Create an empty dict. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001753 if (self->bin) {
1754 s[0] = EMPTY_DICT;
1755 len = 1;
1756 }
1757 else {
1758 s[0] = MARK;
1759 s[1] = DICT;
1760 len = 2;
1761 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001762
Tim Peters0bc93f52003-02-02 18:29:33 +00001763 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001764 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001765
Tim Peters42f08ac2003-02-11 22:43:24 +00001766 /* Get dict size, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001767 if ((len = PyDict_Size(args)) < 0)
1768 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001769
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001770 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001771 if (put(self, args) >= 0)
1772 res = 0;
1773 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001774 }
Tim Peters90975f12003-02-12 05:28:58 +00001775 if (put2(self, args) < 0)
1776 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001777
Tim Peters42f08ac2003-02-11 22:43:24 +00001778 /* Materialize the dict items. */
1779 iter = PyObject_CallMethod(args, "iteritems", "()");
1780 if (iter == NULL)
1781 goto finally;
1782 res = batch_dict(self, iter);
1783 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001785 finally:
1786 if (self->fast && !fast_save_leave(self, args))
1787 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001789 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001790}
1791
1792
Tim Peters84e87f32001-03-17 04:50:51 +00001793static int
Tim Peterscba30e22003-02-01 06:24:36 +00001794save_inst(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001795{
1796 PyObject *class = 0, *module = 0, *name = 0, *state = 0,
1797 *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;
1798 char *module_str, *name_str;
1799 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001800
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001801 static char inst = INST, obj = OBJ, build = BUILD;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001803 if (self->fast && !fast_save_enter(self, args))
1804 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001805
Tim Peters0bc93f52003-02-02 18:29:33 +00001806 if (self->write_func(self, &MARKv, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001807 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001808
Tim Peterscba30e22003-02-01 06:24:36 +00001809 if (!( class = PyObject_GetAttr(args, __class___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001810 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001811
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001812 if (self->bin) {
1813 if (save(self, class, 0) < 0)
1814 goto finally;
1815 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001816
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001817 if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {
1818 PyObject *element = 0;
1819 int i, len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001820
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001821 if (!( class_args =
Tim Peterscba30e22003-02-01 06:24:36 +00001822 PyObject_Call(getinitargs_func, empty_tuple, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001823 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001824
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001825 if ((len = PyObject_Size(class_args)) < 0)
1826 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001828 for (i = 0; i < len; i++) {
Tim Peterscba30e22003-02-01 06:24:36 +00001829 if (!( element = PySequence_GetItem(class_args, i)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001830 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001831
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001832 if (save(self, element, 0) < 0) {
1833 Py_DECREF(element);
1834 goto finally;
1835 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001836
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001837 Py_DECREF(element);
1838 }
1839 }
1840 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00001841 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1842 PyErr_Clear();
1843 else
1844 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001845 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001846
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001847 if (!self->bin) {
1848 if (!( name = ((PyClassObject *)class)->cl_name )) {
1849 PyErr_SetString(PicklingError, "class has no name");
1850 goto finally;
1851 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001852
Tim Peterscba30e22003-02-01 06:24:36 +00001853 if (!( module = whichmodule(class, name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001854 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001855
Tim Peters84e87f32001-03-17 04:50:51 +00001856
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001857 if ((module_size = PyString_Size(module)) < 0 ||
1858 (name_size = PyString_Size(name)) < 0)
1859 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001861 module_str = PyString_AS_STRING((PyStringObject *)module);
1862 name_str = PyString_AS_STRING((PyStringObject *)name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001863
Tim Peters0bc93f52003-02-02 18:29:33 +00001864 if (self->write_func(self, &inst, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001865 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001866
Tim Peters0bc93f52003-02-02 18:29:33 +00001867 if (self->write_func(self, module_str, module_size) < 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, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001871 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001872
Tim Peters0bc93f52003-02-02 18:29:33 +00001873 if (self->write_func(self, name_str, name_size) < 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, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001877 goto finally;
1878 }
Tim Peters0bc93f52003-02-02 18:29:33 +00001879 else if (self->write_func(self, &obj, 1) < 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001880 goto finally;
1881 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001883 if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {
1884 state = PyObject_Call(getstate_func, empty_tuple, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00001885 if (!state)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001886 goto finally;
1887 }
1888 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00001889 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1890 PyErr_Clear();
1891 else
1892 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001893
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001894 if (!( state = PyObject_GetAttr(args, __dict___str))) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00001895 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1896 PyErr_Clear();
1897 else
1898 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001899 res = 0;
1900 goto finally;
1901 }
1902 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001903
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001904 if (!PyDict_Check(state)) {
1905 if (put2(self, args) < 0)
1906 goto finally;
1907 }
1908 else {
1909 if (put(self, args) < 0)
1910 goto finally;
1911 }
Tim Peters84e87f32001-03-17 04:50:51 +00001912
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001913 if (save(self, state, 0) < 0)
1914 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001915
Tim Peters0bc93f52003-02-02 18:29:33 +00001916 if (self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001917 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001918
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001919 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001920
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001921 finally:
1922 if (self->fast && !fast_save_leave(self, args))
1923 res = -1;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001924
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001925 Py_XDECREF(module);
1926 Py_XDECREF(class);
1927 Py_XDECREF(state);
1928 Py_XDECREF(getinitargs_func);
1929 Py_XDECREF(getstate_func);
1930 Py_XDECREF(class_args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001931
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001932 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001933}
1934
1935
Guido van Rossum60456fd1997-04-09 17:36:32 +00001936static int
Tim Peterscba30e22003-02-01 06:24:36 +00001937save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001938{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001939 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001940 char *name_str, *module_str;
1941 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001943 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001944
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001945 if (name) {
1946 global_name = name;
1947 Py_INCREF(global_name);
1948 }
1949 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001950 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001951 goto finally;
1952 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001953
Tim Peterscba30e22003-02-01 06:24:36 +00001954 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001955 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001956
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001957 if ((module_size = PyString_Size(module)) < 0 ||
1958 (name_size = PyString_Size(global_name)) < 0)
1959 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001960
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001961 module_str = PyString_AS_STRING((PyStringObject *)module);
1962 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001963
Guido van Rossum75bfd052002-12-24 18:10:07 +00001964 /* XXX This can be doing a relative import. Clearly it shouldn't,
1965 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001966 mod = PyImport_ImportModule(module_str);
1967 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001968 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001969 "Can't pickle %s: import of module %s "
1970 "failed",
1971 "OS", args, module);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001972 goto finally;
1973 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001974 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001975 if (klass == NULL) {
1976 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001977 "Can't pickle %s: attribute lookup %s.%s "
1978 "failed",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001979 "OSS", args, module, global_name);
1980 goto finally;
1981 }
1982 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001983 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001984 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00001985 "Can't pickle %s: it's not the same object "
1986 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001987 "OSS", args, module, global_name);
1988 goto finally;
1989 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001990 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001991
Tim Peters731098b2003-02-04 20:56:09 +00001992 if (self->proto >= 2) {
1993 /* See whether this is in the extension registry, and if
1994 * so generate an EXT opcode.
1995 */
1996 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00001997 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00001998 char c_str[5];
1999 int n;
2000
2001 PyTuple_SET_ITEM(two_tuple, 0, module);
2002 PyTuple_SET_ITEM(two_tuple, 1, global_name);
2003 py_code = PyDict_GetItem(extension_registry, two_tuple);
2004 if (py_code == NULL)
2005 goto gen_global; /* not registered */
2006
2007 /* Verify py_code has the right type and value. */
2008 if (!PyInt_Check(py_code)) {
2009 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00002010 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00002011 "OO", args, py_code);
2012 goto finally;
2013 }
2014 code = PyInt_AS_LONG(py_code);
2015 if (code <= 0 || code > 0x7fffffffL) {
2016 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
2017 "extension code %ld is out of range",
2018 "Ol", args, code);
2019 goto finally;
2020 }
2021
2022 /* Generate an EXT opcode. */
2023 if (code <= 0xff) {
2024 c_str[0] = EXT1;
2025 c_str[1] = (char)code;
2026 n = 2;
2027 }
2028 else if (code <= 0xffff) {
2029 c_str[0] = EXT2;
2030 c_str[1] = (char)(code & 0xff);
2031 c_str[2] = (char)((code >> 8) & 0xff);
2032 n = 3;
2033 }
2034 else {
2035 c_str[0] = EXT4;
2036 c_str[1] = (char)(code & 0xff);
2037 c_str[2] = (char)((code >> 8) & 0xff);
2038 c_str[3] = (char)((code >> 16) & 0xff);
2039 c_str[4] = (char)((code >> 24) & 0xff);
2040 n = 5;
2041 }
2042
2043 if (self->write_func(self, c_str, n) >= 0)
2044 res = 0;
2045 goto finally; /* and don't memoize */
2046 }
2047
2048 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00002049 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002050 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002051
Tim Peters0bc93f52003-02-02 18:29:33 +00002052 if (self->write_func(self, module_str, module_size) < 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, "\n", 1) < 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, name_str, name_size) < 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, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002062 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002063
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002064 if (put(self, args) < 0)
2065 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002066
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002067 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002069 finally:
2070 Py_XDECREF(module);
2071 Py_XDECREF(global_name);
2072 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002073
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002074 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002075}
2076
Guido van Rossum60456fd1997-04-09 17:36:32 +00002077static int
Tim Peterscba30e22003-02-01 06:24:36 +00002078save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002079{
2080 PyObject *pid = 0;
2081 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002082
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002083 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002085 Py_INCREF(args);
2086 ARG_TUP(self, args);
2087 if (self->arg) {
2088 pid = PyObject_Call(f, self->arg, NULL);
2089 FREE_ARG_TUP(self);
2090 }
2091 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002092
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002093 if (pid != Py_None) {
2094 if (!self->bin) {
2095 if (!PyString_Check(pid)) {
2096 PyErr_SetString(PicklingError,
2097 "persistent id must be string");
2098 goto finally;
2099 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002100
Tim Peters0bc93f52003-02-02 18:29:33 +00002101 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002102 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002103
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002104 if ((size = PyString_Size(pid)) < 0)
2105 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002106
Tim Peters0bc93f52003-02-02 18:29:33 +00002107 if (self->write_func(self,
2108 PyString_AS_STRING(
2109 (PyStringObject *)pid),
2110 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002111 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002112
Tim Peters0bc93f52003-02-02 18:29:33 +00002113 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002114 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002116 res = 1;
2117 goto finally;
2118 }
2119 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00002120 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002121 res = -1;
2122 else
2123 res = 1;
2124 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002125
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002126 goto finally;
2127 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002129 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002131 finally:
2132 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002133
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002134 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002135}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002136
Tim Peters71fcda52003-02-14 23:05:28 +00002137/* We're saving ob, and args is the 2-thru-5 tuple returned by the
2138 * appropriate __reduce__ method for ob.
2139 */
Tim Peters84e87f32001-03-17 04:50:51 +00002140static int
Tim Peters71fcda52003-02-14 23:05:28 +00002141save_reduce(Picklerobject *self, PyObject *args, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002142{
Tim Peters71fcda52003-02-14 23:05:28 +00002143 PyObject *callable;
2144 PyObject *argtup;
2145 PyObject *state = NULL;
2146 PyObject *listitems = NULL;
2147 PyObject *dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002148
Tim Peters71fcda52003-02-14 23:05:28 +00002149 int use_newobj = self->proto >= 2;
2150
2151 static char reduce = REDUCE;
2152 static char build = BUILD;
2153 static char newobj = NEWOBJ;
2154
2155 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
2156 &callable,
2157 &argtup,
2158 &state,
2159 &listitems,
2160 &dictitems))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002161 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002162
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002163 if (!PyTuple_Check(argtup)) {
2164 PyErr_SetString(PicklingError,
2165 "args from reduce() should be a tuple");
2166 return -1;
2167 }
2168
Tim Peters71fcda52003-02-14 23:05:28 +00002169 if (state == Py_None)
2170 state = NULL;
2171 if (listitems == Py_None)
2172 listitems = NULL;
2173 if (dictitems == Py_None)
2174 dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002175
Tim Peters71fcda52003-02-14 23:05:28 +00002176 /* Protocol 2 special case: if callable's name is __newobj__, use
2177 * NEWOBJ. This consumes a lot of code.
2178 */
2179 if (use_newobj) {
2180 PyObject *temp = PyObject_GetAttr(callable, __name___str);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002181
Tim Peters71fcda52003-02-14 23:05:28 +00002182 if (temp == NULL) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002183 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2184 PyErr_Clear();
2185 else
2186 return -1;
Tim Peters71fcda52003-02-14 23:05:28 +00002187 use_newobj = 0;
2188 }
2189 else {
2190 use_newobj = PyString_Check(temp) &&
2191 strcmp(PyString_AS_STRING(temp),
2192 "__newobj__") == 0;
2193 Py_DECREF(temp);
2194 }
2195 }
2196 if (use_newobj) {
2197 PyObject *cls;
2198 PyObject *newargtup;
2199 int n, i;
2200
2201 /* Sanity checks. */
2202 n = PyTuple_Size(argtup);
2203 if (n < 1) {
2204 PyErr_SetString(PicklingError, "__newobj__ arglist "
2205 "is empty");
2206 return -1;
2207 }
2208
2209 cls = PyTuple_GET_ITEM(argtup, 0);
2210 if (! PyObject_HasAttrString(cls, "__new__")) {
2211 PyErr_SetString(PicklingError, "args[0] from "
2212 "__newobj__ args has no __new__");
2213 return -1;
2214 }
2215
2216 /* XXX How could ob be NULL? */
2217 if (ob != NULL) {
2218 PyObject *ob_dot_class;
2219
2220 ob_dot_class = PyObject_GetAttr(ob, __class___str);
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002221 if (ob_dot_class == NULL) {
2222 if (PyErr_ExceptionMatches(
2223 PyExc_AttributeError))
2224 PyErr_Clear();
2225 else
2226 return -1;
2227 }
Tim Peters71fcda52003-02-14 23:05:28 +00002228 i = ob_dot_class != cls; /* true iff a problem */
2229 Py_XDECREF(ob_dot_class);
2230 if (i) {
2231 PyErr_SetString(PicklingError, "args[0] from "
2232 "__newobj__ args has the wrong class");
2233 return -1;
2234 }
2235 }
2236
2237 /* Save the class and its __new__ arguments. */
2238 if (save(self, cls, 0) < 0)
2239 return -1;
2240
2241 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2242 if (newargtup == NULL)
2243 return -1;
2244 for (i = 1; i < n; ++i) {
2245 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2246 Py_INCREF(temp);
2247 PyTuple_SET_ITEM(newargtup, i-1, temp);
2248 }
2249 i = save(self, newargtup, 0) < 0;
2250 Py_DECREF(newargtup);
2251 if (i < 0)
2252 return -1;
2253
2254 /* Add NEWOBJ opcode. */
2255 if (self->write_func(self, &newobj, 1) < 0)
2256 return -1;
2257 }
2258 else {
2259 /* Not using NEWOBJ. */
2260 if (save(self, callable, 0) < 0 ||
2261 save(self, argtup, 0) < 0 ||
2262 self->write_func(self, &reduce, 1) < 0)
2263 return -1;
2264 }
2265
2266 /* Memoize. */
2267 /* XXX How can ob be NULL? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002268 if (ob != NULL) {
2269 if (state && !PyDict_Check(state)) {
2270 if (put2(self, ob) < 0)
2271 return -1;
2272 }
Tim Peters71fcda52003-02-14 23:05:28 +00002273 else if (put(self, ob) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002274 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002275 }
Tim Peters84e87f32001-03-17 04:50:51 +00002276
Guido van Rossum60456fd1997-04-09 17:36:32 +00002277
Tim Peters71fcda52003-02-14 23:05:28 +00002278 if (listitems && batch_list(self, listitems) < 0)
2279 return -1;
2280
2281 if (dictitems && batch_dict(self, dictitems) < 0)
2282 return -1;
2283
2284 if (state) {
2285 if (save(self, state, 0) < 0 ||
2286 self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002287 return -1;
2288 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002289
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002290 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002291}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002292
Guido van Rossum60456fd1997-04-09 17:36:32 +00002293static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002294save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002295{
2296 PyTypeObject *type;
Tim Peters71fcda52003-02-14 23:05:28 +00002297 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
2298 PyObject *arg_tup;
2299 int res = -1;
2300 int tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002301
Martin v. Löwis5a395302002-08-04 08:20:23 +00002302 if (self->nesting++ > Py_GetRecursionLimit()){
2303 PyErr_SetString(PyExc_RuntimeError,
2304 "maximum recursion depth exceeded");
2305 goto finally;
2306 }
2307
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002308 if (!pers_save && self->pers_func) {
2309 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2310 res = tmp;
2311 goto finally;
2312 }
2313 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002314
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002315 if (args == Py_None) {
2316 res = save_none(self, args);
2317 goto finally;
2318 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002319
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002320 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002321
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002322 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002323 case 'b':
2324 if (args == Py_False || args == Py_True) {
2325 res = save_bool(self, args);
2326 goto finally;
2327 }
2328 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002329 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002330 if (type == &PyInt_Type) {
2331 res = save_int(self, args);
2332 goto finally;
2333 }
2334 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002335
Guido van Rossum60456fd1997-04-09 17:36:32 +00002336 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002337 if (type == &PyLong_Type) {
2338 res = save_long(self, args);
2339 goto finally;
2340 }
2341 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002342
Guido van Rossum60456fd1997-04-09 17:36:32 +00002343 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002344 if (type == &PyFloat_Type) {
2345 res = save_float(self, args);
2346 goto finally;
2347 }
2348 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002349
Guido van Rossum60456fd1997-04-09 17:36:32 +00002350 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002351 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2352 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002353 goto finally;
2354 }
2355 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002356
Guido van Rossum60456fd1997-04-09 17:36:32 +00002357 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002358 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2359 res = save_string(self, args, 0);
2360 goto finally;
2361 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002362
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002363#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002364 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002365 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2366 res = save_unicode(self, args, 0);
2367 goto finally;
2368 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002369#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002370 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002372 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002373 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002374 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002375
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002376 if (PyDict_GetItem(self->memo, py_ob_id)) {
2377 if (get(self, py_ob_id) < 0)
2378 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002379
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002380 res = 0;
2381 goto finally;
2382 }
2383 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002385 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002386 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002387 if (type == &PyString_Type) {
2388 res = save_string(self, args, 1);
2389 goto finally;
2390 }
2391 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002392
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002393#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002394 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002395 if (type == &PyUnicode_Type) {
2396 res = save_unicode(self, args, 1);
2397 goto finally;
2398 }
2399 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002400#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002401
Guido van Rossum60456fd1997-04-09 17:36:32 +00002402 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002403 if (type == &PyTuple_Type) {
2404 res = save_tuple(self, args);
2405 goto finally;
2406 }
2407 if (type == &PyType_Type) {
2408 res = save_global(self, args, NULL);
2409 goto finally;
2410 }
2411 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002412
Guido van Rossum60456fd1997-04-09 17:36:32 +00002413 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002414 if (type == &PyList_Type) {
2415 res = save_list(self, args);
2416 goto finally;
2417 }
2418 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002419
2420 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002421 if (type == &PyDict_Type) {
2422 res = save_dict(self, args);
2423 goto finally;
2424 }
2425 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002426
2427 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002428 if (type == &PyInstance_Type) {
2429 res = save_inst(self, args);
2430 goto finally;
2431 }
2432 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002433
2434 case 'c':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002435 if (type == &PyClass_Type) {
2436 res = save_global(self, args, NULL);
2437 goto finally;
2438 }
2439 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002440
2441 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002442 if (type == &PyFunction_Type) {
2443 res = save_global(self, args, NULL);
Christian Tismer2460c622004-02-26 16:21:45 +00002444 if (res && PyErr_ExceptionMatches(PickleError)) {
2445 /* fall back to reduce */
2446 PyErr_Clear();
2447 break;
2448 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002449 goto finally;
2450 }
2451 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002452
2453 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002454 if (type == &PyCFunction_Type) {
2455 res = save_global(self, args, NULL);
2456 goto finally;
2457 }
2458 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002460 if (!pers_save && self->inst_pers_func) {
2461 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2462 res = tmp;
2463 goto finally;
2464 }
2465 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002466
Jeremy Hylton39c61162002-07-16 19:47:43 +00002467 if (PyType_IsSubtype(type, &PyType_Type)) {
2468 res = save_global(self, args, NULL);
2469 goto finally;
2470 }
2471
Guido van Rossumb289b872003-02-19 01:45:13 +00002472 /* Get a reduction callable, and call it. This may come from
2473 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
2474 * or the object's __reduce__ method.
Tim Peters71fcda52003-02-14 23:05:28 +00002475 */
Tim Peters5aa3da62003-02-13 21:03:57 +00002476 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2477 if (__reduce__ != NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002478 Py_INCREF(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00002479 Py_INCREF(args);
2480 ARG_TUP(self, args);
2481 if (self->arg) {
2482 t = PyObject_Call(__reduce__, self->arg, NULL);
2483 FREE_ARG_TUP(self);
2484 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002485 }
2486 else {
Guido van Rossumb289b872003-02-19 01:45:13 +00002487 /* Check for a __reduce_ex__ method. */
2488 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2489 if (__reduce__ != NULL) {
2490 t = PyInt_FromLong(self->proto);
2491 if (t != NULL) {
2492 ARG_TUP(self, t);
2493 t = NULL;
2494 if (self->arg) {
2495 t = PyObject_Call(__reduce__,
2496 self->arg, NULL);
2497 FREE_ARG_TUP(self);
2498 }
2499 }
2500 }
2501 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002502 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2503 PyErr_Clear();
2504 else
2505 goto finally;
Guido van Rossumb289b872003-02-19 01:45:13 +00002506 /* Check for a __reduce__ method. */
2507 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2508 if (__reduce__ != NULL) {
2509 t = PyObject_Call(__reduce__,
2510 empty_tuple, NULL);
2511 }
2512 else {
2513 PyErr_SetObject(UnpickleableError, args);
2514 goto finally;
2515 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002516 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002517 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002518
Tim Peters71fcda52003-02-14 23:05:28 +00002519 if (t == NULL)
2520 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002521
Tim Peters71fcda52003-02-14 23:05:28 +00002522 if (PyString_Check(t)) {
2523 res = save_global(self, args, t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002524 goto finally;
2525 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002526
Tim Peters71fcda52003-02-14 23:05:28 +00002527 if (! PyTuple_Check(t)) {
2528 cPickle_ErrFormat(PicklingError, "Value returned by "
2529 "%s must be string or tuple",
2530 "O", __reduce__);
2531 goto finally;
2532 }
2533
2534 size = PyTuple_Size(t);
2535 if (size < 2 || size > 5) {
2536 cPickle_ErrFormat(PicklingError, "tuple returned by "
2537 "%s must contain 2 through 5 elements",
2538 "O", __reduce__);
2539 goto finally;
2540 }
2541
2542 arg_tup = PyTuple_GET_ITEM(t, 1);
2543 if (!(PyTuple_Check(arg_tup) || arg_tup == Py_None)) {
2544 cPickle_ErrFormat(PicklingError, "Second element of "
2545 "tuple returned by %s must be a tuple",
2546 "O", __reduce__);
2547 goto finally;
2548 }
2549
2550 res = save_reduce(self, t, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002552 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002553 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002554 Py_XDECREF(py_ob_id);
2555 Py_XDECREF(__reduce__);
2556 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002558 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002559}
2560
2561
2562static int
Tim Peterscba30e22003-02-01 06:24:36 +00002563dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002564{
2565 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002566
Tim Peters4190fb82003-02-02 16:09:05 +00002567 if (self->proto >= 2) {
2568 char bytes[2];
2569
2570 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002571 assert(self->proto >= 0 && self->proto < 256);
2572 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002573 if (self->write_func(self, bytes, 2) < 0)
2574 return -1;
2575 }
2576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002577 if (save(self, args, 0) < 0)
2578 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002579
Tim Peters4190fb82003-02-02 16:09:05 +00002580 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002581 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002582
Tim Peters4190fb82003-02-02 16:09:05 +00002583 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002584 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002585
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002586 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002587}
2588
2589static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002590Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002591{
Tim Peterscba30e22003-02-01 06:24:36 +00002592 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002593 PyDict_Clear(self->memo);
2594 Py_INCREF(Py_None);
2595 return Py_None;
2596}
2597
2598static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002599Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002600{
2601 int l, i, rsize, ssize, clear=1, lm;
2602 long ik;
2603 PyObject *k, *r;
2604 char *s, *p, *have_get;
2605 Pdata *data;
2606
2607 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002608 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002609 return NULL;
2610
2611 /* Check to make sure we are based on a list */
2612 if (! Pdata_Check(self->file)) {
2613 PyErr_SetString(PicklingError,
2614 "Attempt to getvalue() a non-list-based pickler");
2615 return NULL;
2616 }
2617
2618 /* flush write buffer */
2619 if (write_other(self, NULL, 0) < 0) return NULL;
2620
2621 data=(Pdata*)self->file;
2622 l=data->length;
2623
2624 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002625 lm = PyDict_Size(self->memo);
2626 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002627 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002628 have_get = malloc(lm);
2629 if (have_get == NULL) return PyErr_NoMemory();
2630 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002631
2632 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002633 for (rsize = 0, i = l; --i >= 0; ) {
2634 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002635
Tim Petersac5687a2003-02-02 18:08:34 +00002636 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002637 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002638
2639 else if (PyInt_Check(k)) { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002640 ik = PyInt_AS_LONG((PyIntObject*)k);
2641 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002642 PyErr_SetString(PicklingError,
2643 "Invalid get data");
Neal Norwitz98a96002006-07-23 07:57:11 +00002644 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002645 }
Tim Petersac5687a2003-02-02 18:08:34 +00002646 if (have_get[ik]) /* with matching get */
2647 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002648 }
2649
2650 else if (! (PyTuple_Check(k) &&
2651 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002652 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002653 ) {
2654 PyErr_SetString(PicklingError,
2655 "Unexpected data in internal list");
Neal Norwitz98a96002006-07-23 07:57:11 +00002656 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002657 }
2658
2659 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002660 ik = PyInt_AS_LONG((PyIntObject *)k);
2661 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002662 PyErr_SetString(PicklingError,
2663 "Invalid get data");
2664 return NULL;
2665 }
Tim Petersac5687a2003-02-02 18:08:34 +00002666 have_get[ik] = 1;
2667 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002668 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002669 }
2670
2671 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002672 r = PyString_FromStringAndSize(NULL, rsize);
2673 if (r == NULL) goto err;
2674 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002675
Tim Petersac5687a2003-02-02 18:08:34 +00002676 for (i = 0; i < l; i++) {
2677 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002678
2679 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002680 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002681 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002682 p=PyString_AS_STRING((PyStringObject *)k);
2683 while (--ssize >= 0)
2684 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002685 }
2686 }
2687
2688 else if (PyTuple_Check(k)) { /* get */
Tim Petersac5687a2003-02-02 18:08:34 +00002689 ik = PyInt_AS_LONG((PyIntObject *)
2690 PyTuple_GET_ITEM(k, 0));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002691 if (ik < 256) {
2692 *s++ = BINGET;
2693 *s++ = (int)(ik & 0xff);
2694 }
2695 else {
2696 *s++ = LONG_BINGET;
2697 *s++ = (int)(ik & 0xff);
2698 *s++ = (int)((ik >> 8) & 0xff);
2699 *s++ = (int)((ik >> 16) & 0xff);
2700 *s++ = (int)((ik >> 24) & 0xff);
2701 }
2702 }
2703
2704 else { /* put */
Tim Petersac5687a2003-02-02 18:08:34 +00002705 ik = PyInt_AS_LONG((PyIntObject*)k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002706
2707 if (have_get[ik]) { /* with matching get */
2708 if (ik < 256) {
2709 *s++ = BINPUT;
2710 *s++ = (int)(ik & 0xff);
2711 }
2712 else {
2713 *s++ = LONG_BINPUT;
2714 *s++ = (int)(ik & 0xff);
2715 *s++ = (int)((ik >> 8) & 0xff);
2716 *s++ = (int)((ik >> 16) & 0xff);
2717 *s++ = (int)((ik >> 24) & 0xff);
2718 }
2719 }
2720 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002721 }
2722
2723 if (clear) {
2724 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002725 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002726 }
2727
2728 free(have_get);
2729 return r;
2730 err:
2731 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002732 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002733}
2734
2735static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002736Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002737{
2738 PyObject *ob;
2739 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002740
Tim Peterscba30e22003-02-01 06:24:36 +00002741 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002742 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002743
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002744 if (dump(self, ob) < 0)
2745 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002746
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002747 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002748
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002749 /* XXX Why does dump() return self? */
2750 Py_INCREF(self);
2751 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002752}
2753
2754
Tim Peterscba30e22003-02-01 06:24:36 +00002755static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002756{
Neal Norwitzb0493252002-03-31 14:44:22 +00002757 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002758 PyDoc_STR("dump(object) -- "
2759 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002760 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002761 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002762 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002763 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002764 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002765};
2766
2767
2768static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002769newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002770{
2771 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002772
Tim Peters5bd2a792003-02-01 16:45:06 +00002773 if (proto < 0)
Tim Peters8587b3c2003-02-13 15:44:41 +00002774 proto = HIGHEST_PROTOCOL;
2775 if (proto > HIGHEST_PROTOCOL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002776 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2777 "the highest available protocol is %d",
Tim Peters8587b3c2003-02-13 15:44:41 +00002778 proto, HIGHEST_PROTOCOL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002779 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002780 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002781
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002782 self = PyObject_GC_New(Picklerobject, &Picklertype);
Tim Peters5bd2a792003-02-01 16:45:06 +00002783 if (self == NULL)
2784 return NULL;
2785 self->proto = proto;
2786 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002787 self->fp = NULL;
2788 self->write = NULL;
2789 self->memo = NULL;
2790 self->arg = NULL;
2791 self->pers_func = NULL;
2792 self->inst_pers_func = NULL;
2793 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002794 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002795 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002796 self->fast_container = 0;
2797 self->fast_memo = NULL;
2798 self->buf_size = 0;
2799 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002800
Tim Peters5bd2a792003-02-01 16:45:06 +00002801 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002802 if (file)
2803 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002804 else {
2805 file = Pdata_New();
2806 if (file == NULL)
2807 goto err;
2808 }
2809 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002810
Tim Peterscba30e22003-02-01 06:24:36 +00002811 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002812 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002813
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002814 if (PyFile_Check(file)) {
2815 self->fp = PyFile_AsFile(file);
2816 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002817 PyErr_SetString(PyExc_ValueError,
2818 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002819 goto err;
2820 }
2821 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002822 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002823 else if (PycStringIO_OutputCheck(file)) {
2824 self->write_func = write_cStringIO;
2825 }
2826 else if (file == Py_None) {
2827 self->write_func = write_none;
2828 }
2829 else {
2830 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002831
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002832 if (! Pdata_Check(file)) {
2833 self->write = PyObject_GetAttr(file, write_str);
2834 if (!self->write) {
2835 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002836 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002837 "argument must have 'write' "
2838 "attribute");
2839 goto err;
2840 }
2841 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002842
Tim Peters5bd2a792003-02-01 16:45:06 +00002843 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2844 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002845 PyErr_NoMemory();
2846 goto err;
2847 }
2848 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002849
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002850 if (PyEval_GetRestricted()) {
2851 /* Restricted execution, get private tables */
Tim Peters5b7da392003-02-04 00:21:07 +00002852 PyObject *m = PyImport_Import(copy_reg_str);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002853
Tim Peters5b7da392003-02-04 00:21:07 +00002854 if (m == NULL)
2855 goto err;
2856 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002857 Py_DECREF(m);
Tim Peters5b7da392003-02-04 00:21:07 +00002858 if (self->dispatch_table == NULL)
2859 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002860 }
2861 else {
Tim Peters5b7da392003-02-04 00:21:07 +00002862 self->dispatch_table = dispatch_table;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002863 Py_INCREF(dispatch_table);
2864 }
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002865 PyObject_GC_Track(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002867 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002868
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002869 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002870 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002871 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002872}
2873
2874
2875static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00002876get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002877{
Martin v. Löwis15e62742006-02-27 16:46:16 +00002878 static char *kwlist[] = {"file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002879 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002880 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002881
Tim Peters92c8bb32003-02-13 23:00:26 +00002882 /* XXX
Martin v. Löwis544f1192004-07-27 05:22:33 +00002883 * The documented signature is Pickler(file, protocol=0), but this
Tim Peters92c8bb32003-02-13 23:00:26 +00002884 * accepts Pickler() and Pickler(integer) too. The meaning then
2885 * is clear as mud, undocumented, and not supported by pickle.py.
2886 * I'm told Zope uses this, but I haven't traced into this code
2887 * far enough to figure out what it means.
Tim Peters5bd2a792003-02-01 16:45:06 +00002888 */
2889 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002890 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002891 proto = 0;
Martin v. Löwis544f1192004-07-27 05:22:33 +00002892 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
2893 kwlist, &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002894 return NULL;
2895 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002896 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002897}
2898
2899
2900static void
Tim Peterscba30e22003-02-01 06:24:36 +00002901Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002902{
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002903 PyObject_GC_UnTrack(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002904 Py_XDECREF(self->write);
2905 Py_XDECREF(self->memo);
2906 Py_XDECREF(self->fast_memo);
2907 Py_XDECREF(self->arg);
2908 Py_XDECREF(self->file);
2909 Py_XDECREF(self->pers_func);
2910 Py_XDECREF(self->inst_pers_func);
2911 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002912 PyMem_Free(self->write_buf);
Tim Peters3cfe7542003-05-21 21:29:48 +00002913 self->ob_type->tp_free((PyObject *)self);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002914}
2915
2916static int
2917Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
2918{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002919 Py_VISIT(self->write);
2920 Py_VISIT(self->memo);
2921 Py_VISIT(self->fast_memo);
2922 Py_VISIT(self->arg);
2923 Py_VISIT(self->file);
2924 Py_VISIT(self->pers_func);
2925 Py_VISIT(self->inst_pers_func);
2926 Py_VISIT(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002927 return 0;
2928}
2929
2930static int
2931Pickler_clear(Picklerobject *self)
2932{
Thomas Woutersedf17d82006-04-15 17:28:34 +00002933 Py_CLEAR(self->write);
2934 Py_CLEAR(self->memo);
2935 Py_CLEAR(self->fast_memo);
2936 Py_CLEAR(self->arg);
2937 Py_CLEAR(self->file);
2938 Py_CLEAR(self->pers_func);
2939 Py_CLEAR(self->inst_pers_func);
2940 Py_CLEAR(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002941 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002942}
2943
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002944static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002945Pickler_get_pers_func(Picklerobject *p)
2946{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002947 if (p->pers_func == NULL)
2948 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2949 else
2950 Py_INCREF(p->pers_func);
2951 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002952}
2953
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002954static int
2955Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2956{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002957 if (v == NULL) {
2958 PyErr_SetString(PyExc_TypeError,
2959 "attribute deletion is not supported");
2960 return -1;
2961 }
2962 Py_XDECREF(p->pers_func);
2963 Py_INCREF(v);
2964 p->pers_func = v;
2965 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002966}
2967
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002968static int
2969Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2970{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002971 if (v == NULL) {
2972 PyErr_SetString(PyExc_TypeError,
2973 "attribute deletion is not supported");
2974 return -1;
2975 }
2976 Py_XDECREF(p->inst_pers_func);
2977 Py_INCREF(v);
2978 p->inst_pers_func = v;
2979 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002980}
2981
2982static PyObject *
2983Pickler_get_memo(Picklerobject *p)
2984{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002985 if (p->memo == NULL)
2986 PyErr_SetString(PyExc_AttributeError, "memo");
2987 else
2988 Py_INCREF(p->memo);
2989 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002990}
2991
2992static int
2993Pickler_set_memo(Picklerobject *p, PyObject *v)
2994{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002995 if (v == NULL) {
2996 PyErr_SetString(PyExc_TypeError,
2997 "attribute deletion is not supported");
2998 return -1;
2999 }
3000 if (!PyDict_Check(v)) {
3001 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
3002 return -1;
3003 }
3004 Py_XDECREF(p->memo);
3005 Py_INCREF(v);
3006 p->memo = v;
3007 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003008}
3009
3010static PyObject *
3011Pickler_get_error(Picklerobject *p)
3012{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003013 /* why is this an attribute on the Pickler? */
3014 Py_INCREF(PicklingError);
3015 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003016}
3017
3018static PyMemberDef Pickler_members[] = {
3019 {"binary", T_INT, offsetof(Picklerobject, bin)},
3020 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00003021 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003022};
3023
3024static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00003025 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003026 (setter)Pickler_set_pers_func},
3027 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
3028 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00003029 {"PicklingError", (getter)Pickler_get_error, NULL},
3030 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003031};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003032
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003033PyDoc_STRVAR(Picklertype__doc__,
3034"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003035
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003036static PyTypeObject Picklertype = {
3037 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00003038 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00003039 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003040 sizeof(Picklerobject), /*tp_basicsize*/
3041 0,
3042 (destructor)Pickler_dealloc, /* tp_dealloc */
3043 0, /* tp_print */
3044 0, /* tp_getattr */
3045 0, /* tp_setattr */
3046 0, /* tp_compare */
3047 0, /* tp_repr */
3048 0, /* tp_as_number */
3049 0, /* tp_as_sequence */
3050 0, /* tp_as_mapping */
3051 0, /* tp_hash */
3052 0, /* tp_call */
3053 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00003054 PyObject_GenericGetAttr, /* tp_getattro */
3055 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003056 0, /* tp_as_buffer */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003057 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003058 Picklertype__doc__, /* tp_doc */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00003059 (traverseproc)Pickler_traverse, /* tp_traverse */
3060 (inquiry)Pickler_clear, /* tp_clear */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003061 0, /* tp_richcompare */
3062 0, /* tp_weaklistoffset */
3063 0, /* tp_iter */
3064 0, /* tp_iternext */
3065 Pickler_methods, /* tp_methods */
3066 Pickler_members, /* tp_members */
3067 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003068};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003069
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003070static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003071find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003072{
3073 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003074
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003075 if (fc) {
3076 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00003077 PyErr_SetString(UnpicklingError, "Global and instance "
3078 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003079 return NULL;
3080 }
Georg Brandl684fd0c2006-05-25 19:15:31 +00003081 return PyObject_CallFunctionObjArgs(fc, py_module_name,
3082 py_global_name, NULL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003083 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00003084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003085 module = PySys_GetObject("modules");
3086 if (module == NULL)
3087 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00003088
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003089 module = PyDict_GetItem(module, py_module_name);
3090 if (module == NULL) {
3091 module = PyImport_Import(py_module_name);
3092 if (!module)
3093 return NULL;
3094 global = PyObject_GetAttr(module, py_global_name);
3095 Py_DECREF(module);
3096 }
3097 else
3098 global = PyObject_GetAttr(module, py_global_name);
3099 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003100}
3101
Guido van Rossum2f4caa41997-01-06 22:59:08 +00003102static int
Tim Peterscba30e22003-02-01 06:24:36 +00003103marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003104{
3105 if (self->num_marks < 1) {
3106 PyErr_SetString(UnpicklingError, "could not find MARK");
3107 return -1;
3108 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003109
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003110 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003111}
3112
Tim Peters84e87f32001-03-17 04:50:51 +00003113
Guido van Rossum60456fd1997-04-09 17:36:32 +00003114static int
Tim Peterscba30e22003-02-01 06:24:36 +00003115load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003116{
3117 PDATA_APPEND(self->stack, Py_None, -1);
3118 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003119}
3120
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003121static int
Tim Peterscba30e22003-02-01 06:24:36 +00003122bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003123{
3124 PyErr_SetString(UnpicklingError, "pickle data was truncated");
3125 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003126}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003127
3128static int
Tim Peterscba30e22003-02-01 06:24:36 +00003129load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003130{
3131 PyObject *py_int = 0;
3132 char *endptr, *s;
3133 int len, res = -1;
3134 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003135
Tim Peters0bc93f52003-02-02 18:29:33 +00003136 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003137 if (len < 2) return bad_readline();
3138 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003139
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003140 errno = 0;
3141 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003142
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003143 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
3144 /* Hm, maybe we've got something long. Let's try reading
3145 it as a Python long object. */
3146 errno = 0;
3147 py_int = PyLong_FromString(s, NULL, 0);
3148 if (py_int == NULL) {
3149 PyErr_SetString(PyExc_ValueError,
3150 "could not convert string to int");
3151 goto finally;
3152 }
3153 }
3154 else {
Guido van Rossume2763392002-04-05 19:30:08 +00003155 if (len == 3 && (l == 0 || l == 1)) {
3156 if (!( py_int = PyBool_FromLong(l))) goto finally;
3157 }
3158 else {
3159 if (!( py_int = PyInt_FromLong(l))) goto finally;
3160 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003161 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003163 free(s);
3164 PDATA_PUSH(self->stack, py_int, -1);
3165 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003166
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003167 finally:
3168 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003170 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003171}
3172
Tim Peters3c67d792003-02-02 17:59:11 +00003173static int
3174load_bool(Unpicklerobject *self, PyObject *boolean)
3175{
3176 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00003177 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00003178 return 0;
3179}
3180
Tim Petersee1a53c2003-02-02 02:57:53 +00003181/* s contains x bytes of a little-endian integer. Return its value as a
3182 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3183 * int, but when x is 4 it's a signed one. This is an historical source
3184 * of x-platform bugs.
3185 */
Tim Peters84e87f32001-03-17 04:50:51 +00003186static long
Tim Petersee1a53c2003-02-02 02:57:53 +00003187calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003188{
3189 unsigned char c;
3190 int i;
3191 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003193 for (i = 0, l = 0L; i < x; i++) {
3194 c = (unsigned char)s[i];
3195 l |= (long)c << (i * 8);
3196 }
Tim Petersbfa18f72001-04-10 01:54:42 +00003197#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003198 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3199 * is signed, so on a box with longs bigger than 4 bytes we need
3200 * to extend a BININT's sign bit to the full width.
3201 */
3202 if (x == 4 && l & (1L << 31))
3203 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00003204#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003205 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003206}
3207
3208
3209static int
Tim Peterscba30e22003-02-01 06:24:36 +00003210load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003211{
3212 PyObject *py_int = 0;
3213 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003215 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003216
Tim Peterscba30e22003-02-01 06:24:36 +00003217 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003218 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003220 PDATA_PUSH(self->stack, py_int, -1);
3221 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003222}
3223
3224
3225static int
Tim Peterscba30e22003-02-01 06:24:36 +00003226load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003227{
3228 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003229
Tim Peters0bc93f52003-02-02 18:29:33 +00003230 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003231 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003232
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003233 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003234}
3235
3236
3237static int
Tim Peterscba30e22003-02-01 06:24:36 +00003238load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003239{
3240 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003241
Tim Peters0bc93f52003-02-02 18:29:33 +00003242 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003243 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003244
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003245 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003246}
3247
3248
3249static int
Tim Peterscba30e22003-02-01 06:24:36 +00003250load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003251{
3252 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003253
Tim Peters0bc93f52003-02-02 18:29:33 +00003254 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003255 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003256
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003257 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003258}
Tim Peters84e87f32001-03-17 04:50:51 +00003259
Guido van Rossum60456fd1997-04-09 17:36:32 +00003260static int
Tim Peterscba30e22003-02-01 06:24:36 +00003261load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003262{
3263 PyObject *l = 0;
3264 char *end, *s;
3265 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003266
Tim Peters0bc93f52003-02-02 18:29:33 +00003267 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003268 if (len < 2) return bad_readline();
3269 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003270
Tim Peterscba30e22003-02-01 06:24:36 +00003271 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003272 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003273
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003274 free(s);
3275 PDATA_PUSH(self->stack, l, -1);
3276 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003277
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003278 finally:
3279 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003281 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003282}
3283
Tim Petersee1a53c2003-02-02 02:57:53 +00003284/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3285 * data following.
3286 */
3287static int
3288load_counted_long(Unpicklerobject *self, int size)
3289{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003290 Py_ssize_t i;
Tim Petersee1a53c2003-02-02 02:57:53 +00003291 char *nbytes;
3292 unsigned char *pdata;
3293 PyObject *along;
3294
3295 assert(size == 1 || size == 4);
3296 i = self->read_func(self, &nbytes, size);
3297 if (i < 0) return -1;
3298
3299 size = calc_binint(nbytes, size);
3300 if (size < 0) {
3301 /* Corrupt or hostile pickle -- we never write one like
3302 * this.
3303 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003304 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003305 "byte count");
3306 return -1;
3307 }
3308
3309 if (size == 0)
3310 along = PyLong_FromLong(0L);
3311 else {
3312 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003313 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003314 if (i < 0) return -1;
3315 along = _PyLong_FromByteArray(pdata, (size_t)size,
3316 1 /* little endian */, 1 /* signed */);
3317 }
3318 if (along == NULL)
3319 return -1;
3320 PDATA_PUSH(self->stack, along, -1);
3321 return 0;
3322}
Tim Peters84e87f32001-03-17 04:50:51 +00003323
Guido van Rossum60456fd1997-04-09 17:36:32 +00003324static int
Tim Peterscba30e22003-02-01 06:24:36 +00003325load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003326{
3327 PyObject *py_float = 0;
3328 char *endptr, *s;
3329 int len, res = -1;
3330 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003331
Tim Peters0bc93f52003-02-02 18:29:33 +00003332 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003333 if (len < 2) return bad_readline();
3334 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003336 errno = 0;
Martin v. Löwis737ea822004-06-08 18:52:54 +00003337 d = PyOS_ascii_strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003339 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3340 PyErr_SetString(PyExc_ValueError,
3341 "could not convert string to float");
3342 goto finally;
3343 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003344
Tim Peterscba30e22003-02-01 06:24:36 +00003345 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003346 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003347
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003348 free(s);
3349 PDATA_PUSH(self->stack, py_float, -1);
3350 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003351
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003352 finally:
3353 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003355 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003356}
3357
Guido van Rossum60456fd1997-04-09 17:36:32 +00003358static int
Tim Peterscba30e22003-02-01 06:24:36 +00003359load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003360{
Tim Peters9905b942003-03-20 20:53:32 +00003361 PyObject *py_float;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003362 double x;
3363 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003364
Tim Peters0bc93f52003-02-02 18:29:33 +00003365 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003366 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003367
Tim Peters9905b942003-03-20 20:53:32 +00003368 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3369 if (x == -1.0 && PyErr_Occurred())
3370 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003371
Tim Peters9905b942003-03-20 20:53:32 +00003372 py_float = PyFloat_FromDouble(x);
3373 if (py_float == NULL)
3374 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003375
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003376 PDATA_PUSH(self->stack, py_float, -1);
3377 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003378}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003379
3380static int
Tim Peterscba30e22003-02-01 06:24:36 +00003381load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003382{
3383 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003384 int len, res = -1;
3385 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003386
Tim Peters0bc93f52003-02-02 18:29:33 +00003387 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003388 if (len < 2) return bad_readline();
3389 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003390
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003391
3392 /* Strip outermost quotes */
3393 while (s[len-1] <= ' ')
3394 len--;
3395 if(s[0]=='"' && s[len-1]=='"'){
3396 s[len-1] = '\0';
3397 p = s + 1 ;
3398 len -= 2;
3399 } else if(s[0]=='\'' && s[len-1]=='\''){
3400 s[len-1] = '\0';
3401 p = s + 1 ;
3402 len -= 2;
3403 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003404 goto insecure;
3405 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003406
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003407 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
Neal Norwitz99dfe3c2006-08-02 04:27:11 +00003408 free(s);
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003409 if (str) {
3410 PDATA_PUSH(self->stack, str, -1);
3411 res = 0;
3412 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003413 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003414
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003415 insecure:
3416 free(s);
3417 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3418 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003419}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003420
3421
3422static int
Tim Peterscba30e22003-02-01 06:24:36 +00003423load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003424{
3425 PyObject *py_string = 0;
3426 long l;
3427 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003428
Tim Peters0bc93f52003-02-02 18:29:33 +00003429 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003430
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003431 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003432
Tim Peters0bc93f52003-02-02 18:29:33 +00003433 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003434 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003435
Tim Peterscba30e22003-02-01 06:24:36 +00003436 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003437 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003438
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003439 PDATA_PUSH(self->stack, py_string, -1);
3440 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003441}
3442
3443
3444static int
Tim Peterscba30e22003-02-01 06:24:36 +00003445load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003446{
3447 PyObject *py_string = 0;
3448 unsigned char l;
3449 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003450
Tim Peters0bc93f52003-02-02 18:29:33 +00003451 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003452 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003453
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003454 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003455
Tim Peters0bc93f52003-02-02 18:29:33 +00003456 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003457
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003458 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003459
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003460 PDATA_PUSH(self->stack, py_string, -1);
3461 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003462}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003463
3464
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003465#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003466static int
Tim Peterscba30e22003-02-01 06:24:36 +00003467load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003468{
3469 PyObject *str = 0;
3470 int len, res = -1;
3471 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003472
Tim Peters0bc93f52003-02-02 18:29:33 +00003473 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003474 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003475
Tim Peterscba30e22003-02-01 06:24:36 +00003476 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003477 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003478
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003479 PDATA_PUSH(self->stack, str, -1);
3480 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003481
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003482 finally:
3483 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003484}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003485#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003486
3487
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003488#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003489static int
Tim Peterscba30e22003-02-01 06:24:36 +00003490load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003491{
3492 PyObject *unicode;
3493 long l;
3494 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003495
Tim Peters0bc93f52003-02-02 18:29:33 +00003496 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003497
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003498 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003499
Tim Peters0bc93f52003-02-02 18:29:33 +00003500 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003501 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003502
Tim Peterscba30e22003-02-01 06:24:36 +00003503 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003504 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003506 PDATA_PUSH(self->stack, unicode, -1);
3507 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003508}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003509#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003510
3511
3512static int
Tim Peterscba30e22003-02-01 06:24:36 +00003513load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003514{
3515 PyObject *tup;
3516 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003517
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003518 if ((i = marker(self)) < 0) return -1;
3519 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3520 PDATA_PUSH(self->stack, tup, -1);
3521 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003522}
3523
3524static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003525load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003526{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003527 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003528
Tim Peters1d63c9f2003-02-02 20:29:39 +00003529 if (tup == NULL)
3530 return -1;
3531
3532 while (--len >= 0) {
3533 PyObject *element;
3534
3535 PDATA_POP(self->stack, element);
3536 if (element == NULL)
3537 return -1;
3538 PyTuple_SET_ITEM(tup, len, element);
3539 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003540 PDATA_PUSH(self->stack, tup, -1);
3541 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003542}
3543
3544static int
Tim Peterscba30e22003-02-01 06:24:36 +00003545load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003546{
3547 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003549 if (!( list=PyList_New(0))) return -1;
3550 PDATA_PUSH(self->stack, list, -1);
3551 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003552}
3553
3554static int
Tim Peterscba30e22003-02-01 06:24:36 +00003555load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003556{
3557 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003558
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003559 if (!( dict=PyDict_New())) return -1;
3560 PDATA_PUSH(self->stack, dict, -1);
3561 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003562}
3563
3564
3565static int
Tim Peterscba30e22003-02-01 06:24:36 +00003566load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003567{
3568 PyObject *list = 0;
3569 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003571 if ((i = marker(self)) < 0) return -1;
3572 if (!( list=Pdata_popList(self->stack, i))) return -1;
3573 PDATA_PUSH(self->stack, list, -1);
3574 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003575}
3576
3577static int
Tim Peterscba30e22003-02-01 06:24:36 +00003578load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003579{
3580 PyObject *dict, *key, *value;
3581 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003582
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003583 if ((i = marker(self)) < 0) return -1;
3584 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003585
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003586 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003588 for (k = i+1; k < j; k += 2) {
3589 key =self->stack->data[k-1];
3590 value=self->stack->data[k ];
3591 if (PyDict_SetItem(dict, key, value) < 0) {
3592 Py_DECREF(dict);
3593 return -1;
3594 }
3595 }
3596 Pdata_clear(self->stack, i);
3597 PDATA_PUSH(self->stack, dict, -1);
3598 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003599}
3600
3601static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00003602Instance_New(PyObject *cls, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003603{
Tim Peters1f1b2d22003-02-01 02:16:37 +00003604 PyObject *r = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003606 if (PyClass_Check(cls)) {
3607 int l;
Tim Peters84e87f32001-03-17 04:50:51 +00003608
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003609 if ((l=PyObject_Size(args)) < 0) goto err;
3610 if (!( l )) {
3611 PyObject *__getinitargs__;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003612
Tim Peterscba30e22003-02-01 06:24:36 +00003613 __getinitargs__ = PyObject_GetAttr(cls,
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00003614 __getinitargs___str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003615 if (!__getinitargs__) {
Tim Peterscba30e22003-02-01 06:24:36 +00003616 /* We have a class with no __getinitargs__,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003617 so bypass usual construction */
3618 PyObject *inst;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003619
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003620 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00003621 if (!( inst=PyInstance_NewRaw(cls, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003622 goto err;
3623 return inst;
3624 }
3625 Py_DECREF(__getinitargs__);
3626 }
Tim Peters84e87f32001-03-17 04:50:51 +00003627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003628 if ((r=PyInstance_New(cls, args, NULL))) return r;
3629 else goto err;
3630 }
Tim Peters84e87f32001-03-17 04:50:51 +00003631
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003632 if ((r=PyObject_CallObject(cls, args))) return r;
Guido van Rossum142eeb81997-08-13 03:14:41 +00003633
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003634 err:
3635 {
Neal Norwitz0f8b31a2006-06-28 06:28:31 +00003636 PyObject *tp, *v, *tb, *tmp_value;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003637
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003638 PyErr_Fetch(&tp, &v, &tb);
Neal Norwitz0f8b31a2006-06-28 06:28:31 +00003639 tmp_value = v;
3640 /* NULL occurs when there was a KeyboardInterrupt */
3641 if (tmp_value == NULL)
3642 tmp_value = Py_None;
3643 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003644 Py_XDECREF(v);
3645 v=r;
3646 }
3647 PyErr_Restore(tp,v,tb);
3648 }
3649 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003650}
Tim Peters84e87f32001-03-17 04:50:51 +00003651
Guido van Rossum60456fd1997-04-09 17:36:32 +00003652
3653static int
Tim Peterscba30e22003-02-01 06:24:36 +00003654load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003655{
3656 PyObject *class, *tup, *obj=0;
3657 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003658
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003659 if ((i = marker(self)) < 0) return -1;
3660 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3661 PDATA_POP(self->stack, class);
3662 if (class) {
3663 obj = Instance_New(class, tup);
3664 Py_DECREF(class);
3665 }
3666 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003668 if (! obj) return -1;
3669 PDATA_PUSH(self->stack, obj, -1);
3670 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003671}
3672
3673
3674static int
Tim Peterscba30e22003-02-01 06:24:36 +00003675load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003676{
3677 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3678 int i, len;
3679 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003680
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003681 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003682
Tim Peters0bc93f52003-02-02 18:29:33 +00003683 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003684 if (len < 2) return bad_readline();
3685 module_name = PyString_FromStringAndSize(s, len - 1);
3686 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003687
Tim Peters0bc93f52003-02-02 18:29:33 +00003688 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003689 if (len < 2) return bad_readline();
3690 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003691 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003692 self->find_class);
3693 Py_DECREF(class_name);
3694 }
3695 }
3696 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003697
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003698 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003699
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003700 if ((tup=Pdata_popTuple(self->stack, i))) {
3701 obj = Instance_New(class, tup);
3702 Py_DECREF(tup);
3703 }
3704 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003706 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003708 PDATA_PUSH(self->stack, obj, -1);
3709 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003710}
3711
Tim Peterseab7db32003-02-13 18:24:14 +00003712static int
3713load_newobj(Unpicklerobject *self)
3714{
3715 PyObject *args = NULL;
3716 PyObject *clsraw = NULL;
3717 PyTypeObject *cls; /* clsraw cast to its true type */
3718 PyObject *obj;
3719
3720 /* Stack is ... cls argtuple, and we want to call
3721 * cls.__new__(cls, *argtuple).
3722 */
3723 PDATA_POP(self->stack, args);
3724 if (args == NULL) goto Fail;
3725 if (! PyTuple_Check(args)) {
3726 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3727 "tuple.");
3728 goto Fail;
3729 }
3730
3731 PDATA_POP(self->stack, clsraw);
3732 cls = (PyTypeObject *)clsraw;
3733 if (cls == NULL) goto Fail;
3734 if (! PyType_Check(cls)) {
3735 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3736 "isn't a type object");
3737 goto Fail;
3738 }
3739 if (cls->tp_new == NULL) {
3740 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3741 "has NULL tp_new");
3742 goto Fail;
3743 }
3744
3745 /* Call __new__. */
3746 obj = cls->tp_new(cls, args, NULL);
3747 if (obj == NULL) goto Fail;
3748
3749 Py_DECREF(args);
3750 Py_DECREF(clsraw);
3751 PDATA_PUSH(self->stack, obj, -1);
3752 return 0;
3753
3754 Fail:
3755 Py_XDECREF(args);
3756 Py_XDECREF(clsraw);
3757 return -1;
3758}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003759
3760static int
Tim Peterscba30e22003-02-01 06:24:36 +00003761load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003762{
3763 PyObject *class = 0, *module_name = 0, *class_name = 0;
3764 int len;
3765 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003766
Tim Peters0bc93f52003-02-02 18:29:33 +00003767 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003768 if (len < 2) return bad_readline();
3769 module_name = PyString_FromStringAndSize(s, len - 1);
3770 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003771
Tim Peters0bc93f52003-02-02 18:29:33 +00003772 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003773 if (len < 2) {
3774 Py_DECREF(module_name);
3775 return bad_readline();
3776 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003777 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003778 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003779 self->find_class);
3780 Py_DECREF(class_name);
3781 }
3782 }
3783 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003784
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003785 if (! class) return -1;
3786 PDATA_PUSH(self->stack, class, -1);
3787 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003788}
3789
3790
3791static int
Tim Peterscba30e22003-02-01 06:24:36 +00003792load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003793{
3794 PyObject *pid = 0;
3795 int len;
3796 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003797
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003798 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003799 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003800 if (len < 2) return bad_readline();
3801
3802 pid = PyString_FromStringAndSize(s, len - 1);
3803 if (!pid) return -1;
3804
3805 if (PyList_Check(self->pers_func)) {
3806 if (PyList_Append(self->pers_func, pid) < 0) {
3807 Py_DECREF(pid);
3808 return -1;
3809 }
3810 }
3811 else {
3812 ARG_TUP(self, pid);
3813 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003814 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003815 NULL);
3816 FREE_ARG_TUP(self);
3817 }
3818 }
3819
3820 if (! pid) return -1;
3821
3822 PDATA_PUSH(self->stack, pid, -1);
3823 return 0;
3824 }
3825 else {
3826 PyErr_SetString(UnpicklingError,
3827 "A load persistent id instruction was encountered,\n"
3828 "but no persistent_load function was specified.");
3829 return -1;
3830 }
3831}
3832
3833static int
Tim Peterscba30e22003-02-01 06:24:36 +00003834load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003835{
3836 PyObject *pid = 0;
3837
3838 if (self->pers_func) {
3839 PDATA_POP(self->stack, pid);
3840 if (! pid) return -1;
3841
3842 if (PyList_Check(self->pers_func)) {
3843 if (PyList_Append(self->pers_func, pid) < 0) {
3844 Py_DECREF(pid);
3845 return -1;
3846 }
3847 }
3848 else {
3849 ARG_TUP(self, pid);
3850 if (self->arg) {
3851 pid = PyObject_Call(self->pers_func, self->arg,
3852 NULL);
3853 FREE_ARG_TUP(self);
3854 }
3855 if (! pid) return -1;
3856 }
3857
3858 PDATA_PUSH(self->stack, pid, -1);
3859 return 0;
3860 }
3861 else {
3862 PyErr_SetString(UnpicklingError,
3863 "A load persistent id instruction was encountered,\n"
3864 "but no persistent_load function was specified.");
3865 return -1;
3866 }
3867}
3868
3869
3870static int
Tim Peterscba30e22003-02-01 06:24:36 +00003871load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003872{
3873 int len;
3874
3875 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3876
3877 /* Note that we split the (pickle.py) stack into two stacks,
3878 an object stack and a mark stack. We have to be clever and
3879 pop the right one. We do this by looking at the top of the
3880 mark stack.
3881 */
3882
3883 if ((self->num_marks > 0) &&
3884 (self->marks[self->num_marks - 1] == len))
3885 self->num_marks--;
3886 else {
3887 len--;
3888 Py_DECREF(self->stack->data[len]);
3889 self->stack->length=len;
3890 }
3891
3892 return 0;
3893}
3894
3895
3896static int
Tim Peterscba30e22003-02-01 06:24:36 +00003897load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003898{
3899 int i;
3900
3901 if ((i = marker(self)) < 0)
3902 return -1;
3903
3904 Pdata_clear(self->stack, i);
3905
3906 return 0;
3907}
3908
3909
3910static int
Tim Peterscba30e22003-02-01 06:24:36 +00003911load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003912{
3913 PyObject *last;
3914 int len;
3915
3916 if ((len = self->stack->length) <= 0) return stackUnderflow();
3917 last=self->stack->data[len-1];
3918 Py_INCREF(last);
3919 PDATA_PUSH(self->stack, last, -1);
3920 return 0;
3921}
3922
3923
3924static int
Tim Peterscba30e22003-02-01 06:24:36 +00003925load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003926{
3927 PyObject *py_str = 0, *value = 0;
3928 int len;
3929 char *s;
3930 int rc;
3931
Tim Peters0bc93f52003-02-02 18:29:33 +00003932 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003933 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003935 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003936
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003937 value = PyDict_GetItem(self->memo, py_str);
3938 if (! value) {
3939 PyErr_SetObject(BadPickleGet, py_str);
3940 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003941 }
3942 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003943 PDATA_APPEND(self->stack, value, -1);
3944 rc = 0;
3945 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003947 Py_DECREF(py_str);
3948 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003949}
3950
3951
3952static int
Tim Peterscba30e22003-02-01 06:24:36 +00003953load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003954{
3955 PyObject *py_key = 0, *value = 0;
3956 unsigned char key;
3957 char *s;
3958 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003959
Tim Peters0bc93f52003-02-02 18:29:33 +00003960 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003961
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003962 key = (unsigned char)s[0];
3963 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003964
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003965 value = PyDict_GetItem(self->memo, py_key);
3966 if (! value) {
3967 PyErr_SetObject(BadPickleGet, py_key);
3968 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003969 }
3970 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003971 PDATA_APPEND(self->stack, value, -1);
3972 rc = 0;
3973 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003974
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003975 Py_DECREF(py_key);
3976 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003977}
3978
3979
3980static int
Tim Peterscba30e22003-02-01 06:24:36 +00003981load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003982{
3983 PyObject *py_key = 0, *value = 0;
3984 unsigned char c;
3985 char *s;
3986 long key;
3987 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003988
Tim Peters0bc93f52003-02-02 18:29:33 +00003989 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003990
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003991 c = (unsigned char)s[0];
3992 key = (long)c;
3993 c = (unsigned char)s[1];
3994 key |= (long)c << 8;
3995 c = (unsigned char)s[2];
3996 key |= (long)c << 16;
3997 c = (unsigned char)s[3];
3998 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003999
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004000 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4001
4002 value = PyDict_GetItem(self->memo, py_key);
4003 if (! value) {
4004 PyErr_SetObject(BadPickleGet, py_key);
4005 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00004006 }
4007 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004008 PDATA_APPEND(self->stack, value, -1);
4009 rc = 0;
4010 }
4011
4012 Py_DECREF(py_key);
4013 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004014}
4015
Tim Peters2d629652003-02-04 05:06:17 +00004016/* Push an object from the extension registry (EXT[124]). nbytes is
4017 * the number of bytes following the opcode, holding the index (code) value.
4018 */
4019static int
4020load_extension(Unpicklerobject *self, int nbytes)
4021{
4022 char *codebytes; /* the nbytes bytes after the opcode */
4023 long code; /* calc_binint returns long */
4024 PyObject *py_code; /* code as a Python int */
4025 PyObject *obj; /* the object to push */
4026 PyObject *pair; /* (module_name, class_name) */
4027 PyObject *module_name, *class_name;
4028
4029 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4030 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4031 code = calc_binint(codebytes, nbytes);
4032 if (code <= 0) { /* note that 0 is forbidden */
4033 /* Corrupt or hostile pickle. */
4034 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
4035 return -1;
4036 }
4037
4038 /* Look for the code in the cache. */
4039 py_code = PyInt_FromLong(code);
4040 if (py_code == NULL) return -1;
4041 obj = PyDict_GetItem(extension_cache, py_code);
4042 if (obj != NULL) {
4043 /* Bingo. */
4044 Py_DECREF(py_code);
4045 PDATA_APPEND(self->stack, obj, -1);
4046 return 0;
4047 }
4048
4049 /* Look up the (module_name, class_name) pair. */
4050 pair = PyDict_GetItem(inverted_registry, py_code);
4051 if (pair == NULL) {
4052 Py_DECREF(py_code);
4053 PyErr_Format(PyExc_ValueError, "unregistered extension "
4054 "code %ld", code);
4055 return -1;
4056 }
4057 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00004058 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00004059 */
4060 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
4061 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
4062 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
4063 Py_DECREF(py_code);
4064 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
4065 "isn't a 2-tuple of strings", code);
4066 return -1;
4067 }
4068 /* Load the object. */
4069 obj = find_class(module_name, class_name, self->find_class);
4070 if (obj == NULL) {
4071 Py_DECREF(py_code);
4072 return -1;
4073 }
4074 /* Cache code -> obj. */
4075 code = PyDict_SetItem(extension_cache, py_code, obj);
4076 Py_DECREF(py_code);
4077 if (code < 0) {
4078 Py_DECREF(obj);
4079 return -1;
4080 }
4081 PDATA_PUSH(self->stack, obj, -1);
4082 return 0;
4083}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004084
4085static int
Tim Peterscba30e22003-02-01 06:24:36 +00004086load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004087{
4088 PyObject *py_str = 0, *value = 0;
4089 int len, l;
4090 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004091
Tim Peters0bc93f52003-02-02 18:29:33 +00004092 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004093 if (l < 2) return bad_readline();
4094 if (!( len=self->stack->length )) return stackUnderflow();
4095 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
4096 value=self->stack->data[len-1];
4097 l=PyDict_SetItem(self->memo, py_str, value);
4098 Py_DECREF(py_str);
4099 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004100}
4101
4102
4103static int
Tim Peterscba30e22003-02-01 06:24:36 +00004104load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004105{
4106 PyObject *py_key = 0, *value = 0;
4107 unsigned char key;
4108 char *s;
4109 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004110
Tim Peters0bc93f52003-02-02 18:29:33 +00004111 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004112 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004114 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00004115
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004116 if (!( py_key = PyInt_FromLong((long)key))) return -1;
4117 value=self->stack->data[len-1];
4118 len=PyDict_SetItem(self->memo, py_key, value);
4119 Py_DECREF(py_key);
4120 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004121}
4122
4123
4124static int
Tim Peterscba30e22003-02-01 06:24:36 +00004125load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004126{
4127 PyObject *py_key = 0, *value = 0;
4128 long key;
4129 unsigned char c;
4130 char *s;
4131 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004132
Tim Peters0bc93f52003-02-02 18:29:33 +00004133 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004134 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004136 c = (unsigned char)s[0];
4137 key = (long)c;
4138 c = (unsigned char)s[1];
4139 key |= (long)c << 8;
4140 c = (unsigned char)s[2];
4141 key |= (long)c << 16;
4142 c = (unsigned char)s[3];
4143 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00004144
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004145 if (!( py_key = PyInt_FromLong(key))) return -1;
4146 value=self->stack->data[len-1];
4147 len=PyDict_SetItem(self->memo, py_key, value);
4148 Py_DECREF(py_key);
4149 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004150}
4151
4152
4153static int
Tim Peterscba30e22003-02-01 06:24:36 +00004154do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004155{
4156 PyObject *value = 0, *list = 0, *append_method = 0;
4157 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004158
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004159 len=self->stack->length;
4160 if (!( len >= x && x > 0 )) return stackUnderflow();
4161 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00004162 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004163
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004164 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004165
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004166 if (PyList_Check(list)) {
4167 PyObject *slice;
4168 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00004169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004170 slice=Pdata_popList(self->stack, x);
Neal Norwitzb59d08c2006-07-22 16:20:49 +00004171 if (! slice) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004172 list_len = PyList_GET_SIZE(list);
4173 i=PyList_SetSlice(list, list_len, list_len, slice);
4174 Py_DECREF(slice);
4175 return i;
4176 }
4177 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004178
Tim Peterscba30e22003-02-01 06:24:36 +00004179 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004180 return -1;
4181
4182 for (i = x; i < len; i++) {
4183 PyObject *junk;
4184
4185 value=self->stack->data[i];
4186 junk=0;
4187 ARG_TUP(self, value);
4188 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004189 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004190 NULL);
4191 FREE_ARG_TUP(self);
4192 }
4193 if (! junk) {
4194 Pdata_clear(self->stack, i+1);
4195 self->stack->length=x;
4196 Py_DECREF(append_method);
4197 return -1;
4198 }
4199 Py_DECREF(junk);
4200 }
4201 self->stack->length=x;
4202 Py_DECREF(append_method);
4203 }
4204
4205 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004206}
4207
4208
4209static int
Tim Peterscba30e22003-02-01 06:24:36 +00004210load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004211{
4212 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004213}
4214
4215
4216static int
Tim Peterscba30e22003-02-01 06:24:36 +00004217load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004218{
4219 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004220}
4221
4222
4223static int
Tim Peterscba30e22003-02-01 06:24:36 +00004224do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004225{
4226 PyObject *value = 0, *key = 0, *dict = 0;
4227 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004228
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004229 if (!( (len=self->stack->length) >= x
4230 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004232 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004234 for (i = x+1; i < len; i += 2) {
4235 key =self->stack->data[i-1];
4236 value=self->stack->data[i ];
4237 if (PyObject_SetItem(dict, key, value) < 0) {
4238 r=-1;
4239 break;
4240 }
4241 }
4242
4243 Pdata_clear(self->stack, x);
4244
4245 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004246}
4247
4248
Tim Peters84e87f32001-03-17 04:50:51 +00004249static int
Tim Peterscba30e22003-02-01 06:24:36 +00004250load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004251{
4252 return do_setitems(self, self->stack->length - 2);
4253}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004254
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004255static int
Tim Peterscba30e22003-02-01 06:24:36 +00004256load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004257{
4258 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004259}
4260
Tim Peters84e87f32001-03-17 04:50:51 +00004261
Guido van Rossum60456fd1997-04-09 17:36:32 +00004262static int
Tim Peterscba30e22003-02-01 06:24:36 +00004263load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004264{
Tim Peters080c88b2003-02-15 03:01:11 +00004265 PyObject *state, *inst, *slotstate;
4266 PyObject *__setstate__;
4267 PyObject *d_key, *d_value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004268 Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00004269 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004270
Tim Peters080c88b2003-02-15 03:01:11 +00004271 /* Stack is ... instance, state. We want to leave instance at
4272 * the stack top, possibly mutated via instance.__setstate__(state).
4273 */
4274 if (self->stack->length < 2)
4275 return stackUnderflow();
4276 PDATA_POP(self->stack, state);
4277 if (state == NULL)
4278 return -1;
4279 inst = self->stack->data[self->stack->length - 1];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004280
Tim Peters080c88b2003-02-15 03:01:11 +00004281 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
4282 if (__setstate__ != NULL) {
4283 PyObject *junk = NULL;
4284
4285 /* The explicit __setstate__ is responsible for everything. */
4286 ARG_TUP(self, state);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004287 if (self->arg) {
4288 junk = PyObject_Call(__setstate__, self->arg, NULL);
4289 FREE_ARG_TUP(self);
4290 }
4291 Py_DECREF(__setstate__);
Tim Peters080c88b2003-02-15 03:01:11 +00004292 if (junk == NULL)
4293 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004294 Py_DECREF(junk);
4295 return 0;
4296 }
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00004297 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4298 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004299 PyErr_Clear();
Tim Peters080c88b2003-02-15 03:01:11 +00004300
4301 /* A default __setstate__. First see whether state embeds a
4302 * slot state dict too (a proto 2 addition).
4303 */
4304 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
4305 PyObject *temp = state;
4306 state = PyTuple_GET_ITEM(temp, 0);
4307 slotstate = PyTuple_GET_ITEM(temp, 1);
4308 Py_INCREF(state);
4309 Py_INCREF(slotstate);
4310 Py_DECREF(temp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004311 }
Tim Peters080c88b2003-02-15 03:01:11 +00004312 else
4313 slotstate = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004314
Tim Peters080c88b2003-02-15 03:01:11 +00004315 /* Set inst.__dict__ from the state dict (if any). */
4316 if (state != Py_None) {
4317 PyObject *dict;
4318 if (! PyDict_Check(state)) {
4319 PyErr_SetString(UnpicklingError, "state is not a "
4320 "dictionary");
4321 goto finally;
4322 }
4323 dict = PyObject_GetAttr(inst, __dict___str);
4324 if (dict == NULL)
4325 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004326
Tim Peters080c88b2003-02-15 03:01:11 +00004327 i = 0;
4328 while (PyDict_Next(state, &i, &d_key, &d_value)) {
4329 if (PyObject_SetItem(dict, d_key, d_value) < 0)
4330 goto finally;
4331 }
4332 Py_DECREF(dict);
4333 }
4334
4335 /* Also set instance attributes from the slotstate dict (if any). */
4336 if (slotstate != NULL) {
4337 if (! PyDict_Check(slotstate)) {
4338 PyErr_SetString(UnpicklingError, "slot state is not "
4339 "a dictionary");
4340 goto finally;
4341 }
4342 i = 0;
4343 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4344 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4345 goto finally;
4346 }
4347 }
4348 res = 0;
4349
4350 finally:
4351 Py_DECREF(state);
4352 Py_XDECREF(slotstate);
4353 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004354}
4355
4356
4357static int
Tim Peterscba30e22003-02-01 06:24:36 +00004358load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004359{
4360 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004362 /* Note that we split the (pickle.py) stack into two stacks, an
4363 object stack and a mark stack. Here we push a mark onto the
4364 mark stack.
4365 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004366
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004367 if ((self->num_marks + 1) >= self->marks_size) {
4368 s=self->marks_size+20;
4369 if (s <= self->num_marks) s=self->num_marks + 1;
4370 if (self->marks == NULL)
4371 self->marks=(int *)malloc(s * sizeof(int));
4372 else
Tim Peterscba30e22003-02-01 06:24:36 +00004373 self->marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004374 s * sizeof(int));
4375 if (! self->marks) {
4376 PyErr_NoMemory();
4377 return -1;
4378 }
4379 self->marks_size = s;
4380 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004381
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004382 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004383
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004384 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004385}
4386
Guido van Rossum60456fd1997-04-09 17:36:32 +00004387static int
Tim Peterscba30e22003-02-01 06:24:36 +00004388load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004389{
4390 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004391
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004392 PDATA_POP(self->stack, arg_tup);
4393 if (! arg_tup) return -1;
4394 PDATA_POP(self->stack, callable);
4395 if (callable) {
4396 ob = Instance_New(callable, arg_tup);
4397 Py_DECREF(callable);
4398 }
4399 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004401 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004403 PDATA_PUSH(self->stack, ob, -1);
4404 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004405}
Tim Peters84e87f32001-03-17 04:50:51 +00004406
Tim Peters4190fb82003-02-02 16:09:05 +00004407/* Just raises an error if we don't know the protocol specified. PROTO
4408 * is the first opcode for protocols >= 2.
4409 */
4410static int
4411load_proto(Unpicklerobject *self)
4412{
4413 int i;
4414 char *protobyte;
4415
4416 i = self->read_func(self, &protobyte, 1);
4417 if (i < 0)
4418 return -1;
4419
4420 i = calc_binint(protobyte, 1);
4421 /* No point checking for < 0, since calc_binint returns an unsigned
4422 * int when chewing on 1 byte.
4423 */
4424 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004425 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004426 return 0;
4427
4428 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4429 return -1;
4430}
4431
Guido van Rossum60456fd1997-04-09 17:36:32 +00004432static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004433load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004434{
4435 PyObject *err = 0, *val = 0;
4436 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004437
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004438 self->num_marks = 0;
4439 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004440
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004441 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004442 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004443 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004445 switch (s[0]) {
4446 case NONE:
4447 if (load_none(self) < 0)
4448 break;
4449 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004450
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004451 case BININT:
4452 if (load_binint(self) < 0)
4453 break;
4454 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004455
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004456 case BININT1:
4457 if (load_binint1(self) < 0)
4458 break;
4459 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004460
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004461 case BININT2:
4462 if (load_binint2(self) < 0)
4463 break;
4464 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004465
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004466 case INT:
4467 if (load_int(self) < 0)
4468 break;
4469 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004470
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004471 case LONG:
4472 if (load_long(self) < 0)
4473 break;
4474 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004475
Tim Petersee1a53c2003-02-02 02:57:53 +00004476 case LONG1:
4477 if (load_counted_long(self, 1) < 0)
4478 break;
4479 continue;
4480
4481 case LONG4:
4482 if (load_counted_long(self, 4) < 0)
4483 break;
4484 continue;
4485
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004486 case FLOAT:
4487 if (load_float(self) < 0)
4488 break;
4489 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004491 case BINFLOAT:
4492 if (load_binfloat(self) < 0)
4493 break;
4494 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004495
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004496 case BINSTRING:
4497 if (load_binstring(self) < 0)
4498 break;
4499 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004501 case SHORT_BINSTRING:
4502 if (load_short_binstring(self) < 0)
4503 break;
4504 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004506 case STRING:
4507 if (load_string(self) < 0)
4508 break;
4509 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004510
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004511#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004512 case UNICODE:
4513 if (load_unicode(self) < 0)
4514 break;
4515 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004516
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004517 case BINUNICODE:
4518 if (load_binunicode(self) < 0)
4519 break;
4520 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004521#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004522
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004523 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004524 if (load_counted_tuple(self, 0) < 0)
4525 break;
4526 continue;
4527
4528 case TUPLE1:
4529 if (load_counted_tuple(self, 1) < 0)
4530 break;
4531 continue;
4532
4533 case TUPLE2:
4534 if (load_counted_tuple(self, 2) < 0)
4535 break;
4536 continue;
4537
4538 case TUPLE3:
4539 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004540 break;
4541 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004542
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004543 case TUPLE:
4544 if (load_tuple(self) < 0)
4545 break;
4546 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004547
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004548 case EMPTY_LIST:
4549 if (load_empty_list(self) < 0)
4550 break;
4551 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004552
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004553 case LIST:
4554 if (load_list(self) < 0)
4555 break;
4556 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004558 case EMPTY_DICT:
4559 if (load_empty_dict(self) < 0)
4560 break;
4561 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004562
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004563 case DICT:
4564 if (load_dict(self) < 0)
4565 break;
4566 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004567
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004568 case OBJ:
4569 if (load_obj(self) < 0)
4570 break;
4571 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004572
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004573 case INST:
4574 if (load_inst(self) < 0)
4575 break;
4576 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004577
Tim Peterseab7db32003-02-13 18:24:14 +00004578 case NEWOBJ:
4579 if (load_newobj(self) < 0)
4580 break;
4581 continue;
4582
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004583 case GLOBAL:
4584 if (load_global(self) < 0)
4585 break;
4586 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004587
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004588 case APPEND:
4589 if (load_append(self) < 0)
4590 break;
4591 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004592
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004593 case APPENDS:
4594 if (load_appends(self) < 0)
4595 break;
4596 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004597
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004598 case BUILD:
4599 if (load_build(self) < 0)
4600 break;
4601 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004602
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004603 case DUP:
4604 if (load_dup(self) < 0)
4605 break;
4606 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004607
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004608 case BINGET:
4609 if (load_binget(self) < 0)
4610 break;
4611 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004612
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004613 case LONG_BINGET:
4614 if (load_long_binget(self) < 0)
4615 break;
4616 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004617
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004618 case GET:
4619 if (load_get(self) < 0)
4620 break;
4621 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004622
Tim Peters2d629652003-02-04 05:06:17 +00004623 case EXT1:
4624 if (load_extension(self, 1) < 0)
4625 break;
4626 continue;
4627
4628 case EXT2:
4629 if (load_extension(self, 2) < 0)
4630 break;
4631 continue;
4632
4633 case EXT4:
4634 if (load_extension(self, 4) < 0)
4635 break;
4636 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004637 case MARK:
4638 if (load_mark(self) < 0)
4639 break;
4640 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004641
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004642 case BINPUT:
4643 if (load_binput(self) < 0)
4644 break;
4645 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004646
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004647 case LONG_BINPUT:
4648 if (load_long_binput(self) < 0)
4649 break;
4650 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004651
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004652 case PUT:
4653 if (load_put(self) < 0)
4654 break;
4655 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004656
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004657 case POP:
4658 if (load_pop(self) < 0)
4659 break;
4660 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004662 case POP_MARK:
4663 if (load_pop_mark(self) < 0)
4664 break;
4665 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004666
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004667 case SETITEM:
4668 if (load_setitem(self) < 0)
4669 break;
4670 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004672 case SETITEMS:
4673 if (load_setitems(self) < 0)
4674 break;
4675 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004676
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004677 case STOP:
4678 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004679
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004680 case PERSID:
4681 if (load_persid(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 BINPERSID:
4686 if (load_binpersid(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 REDUCE:
4691 if (load_reduce(self) < 0)
4692 break;
4693 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004694
Tim Peters4190fb82003-02-02 16:09:05 +00004695 case PROTO:
4696 if (load_proto(self) < 0)
4697 break;
4698 continue;
4699
Tim Peters3c67d792003-02-02 17:59:11 +00004700 case NEWTRUE:
4701 if (load_bool(self, Py_True) < 0)
4702 break;
4703 continue;
4704
4705 case NEWFALSE:
4706 if (load_bool(self, Py_False) < 0)
4707 break;
4708 continue;
4709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004710 case '\0':
4711 /* end of file */
4712 PyErr_SetNone(PyExc_EOFError);
4713 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004714
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004715 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004716 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004717 "invalid load key, '%s'.",
4718 "c", s[0]);
4719 return NULL;
4720 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004721
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004722 break;
4723 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004724
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004725 if ((err = PyErr_Occurred())) {
4726 if (err == PyExc_EOFError) {
4727 PyErr_SetNone(PyExc_EOFError);
4728 }
4729 return NULL;
4730 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004731
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004732 PDATA_POP(self->stack, val);
4733 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004734}
Tim Peters84e87f32001-03-17 04:50:51 +00004735
Guido van Rossum60456fd1997-04-09 17:36:32 +00004736
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004737/* No-load functions to support noload, which is used to
4738 find persistent references. */
4739
4740static int
Tim Peterscba30e22003-02-01 06:24:36 +00004741noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004742{
4743 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004744
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004745 if ((i = marker(self)) < 0) return -1;
4746 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004747}
4748
4749
4750static int
Tim Peterscba30e22003-02-01 06:24:36 +00004751noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004752{
4753 int i;
4754 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004755
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004756 if ((i = marker(self)) < 0) return -1;
4757 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004758 if (self->readline_func(self, &s) < 0) return -1;
4759 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00004760 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004761 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004762}
4763
4764static int
Tim Peterseab7db32003-02-13 18:24:14 +00004765noload_newobj(Unpicklerobject *self)
4766{
4767 PyObject *obj;
4768
4769 PDATA_POP(self->stack, obj); /* pop argtuple */
4770 if (obj == NULL) return -1;
4771 Py_DECREF(obj);
4772
4773 PDATA_POP(self->stack, obj); /* pop cls */
4774 if (obj == NULL) return -1;
4775 Py_DECREF(obj);
4776
4777 PDATA_APPEND(self->stack, Py_None, -1);
4778 return 0;
4779}
4780
4781static int
Tim Peterscba30e22003-02-01 06:24:36 +00004782noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004783{
4784 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004785
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;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004788 PDATA_APPEND(self->stack, Py_None,-1);
4789 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004790}
4791
4792static int
Tim Peterscba30e22003-02-01 06:24:36 +00004793noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004794{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004796 if (self->stack->length < 2) return stackUnderflow();
4797 Pdata_clear(self->stack, self->stack->length-2);
4798 PDATA_APPEND(self->stack, Py_None,-1);
4799 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004800}
4801
4802static int
4803noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004804
Guido van Rossum053b8df1998-11-25 16:18:00 +00004805 if (self->stack->length < 1) return stackUnderflow();
4806 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004807 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004808}
4809
Tim Peters2d629652003-02-04 05:06:17 +00004810static int
4811noload_extension(Unpicklerobject *self, int nbytes)
4812{
4813 char *codebytes;
4814
4815 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4816 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4817 PDATA_APPEND(self->stack, Py_None, -1);
4818 return 0;
4819}
4820
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004821
4822static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004823noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004824{
4825 PyObject *err = 0, *val = 0;
4826 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004828 self->num_marks = 0;
4829 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004831 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004832 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004833 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004834
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004835 switch (s[0]) {
4836 case NONE:
4837 if (load_none(self) < 0)
4838 break;
4839 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004840
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004841 case BININT:
4842 if (load_binint(self) < 0)
4843 break;
4844 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004845
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004846 case BININT1:
4847 if (load_binint1(self) < 0)
4848 break;
4849 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004851 case BININT2:
4852 if (load_binint2(self) < 0)
4853 break;
4854 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004855
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004856 case INT:
4857 if (load_int(self) < 0)
4858 break;
4859 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004860
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004861 case LONG:
4862 if (load_long(self) < 0)
4863 break;
4864 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004865
Tim Peters4190fb82003-02-02 16:09:05 +00004866 case LONG1:
4867 if (load_counted_long(self, 1) < 0)
4868 break;
4869 continue;
4870
4871 case LONG4:
4872 if (load_counted_long(self, 4) < 0)
4873 break;
4874 continue;
4875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004876 case FLOAT:
4877 if (load_float(self) < 0)
4878 break;
4879 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004880
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004881 case BINFLOAT:
4882 if (load_binfloat(self) < 0)
4883 break;
4884 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004886 case BINSTRING:
4887 if (load_binstring(self) < 0)
4888 break;
4889 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004890
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004891 case SHORT_BINSTRING:
4892 if (load_short_binstring(self) < 0)
4893 break;
4894 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004895
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004896 case STRING:
4897 if (load_string(self) < 0)
4898 break;
4899 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004900
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004901#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004902 case UNICODE:
4903 if (load_unicode(self) < 0)
4904 break;
4905 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004906
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004907 case BINUNICODE:
4908 if (load_binunicode(self) < 0)
4909 break;
4910 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004911#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004912
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004913 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004914 if (load_counted_tuple(self, 0) < 0)
4915 break;
4916 continue;
4917
4918 case TUPLE1:
4919 if (load_counted_tuple(self, 1) < 0)
4920 break;
4921 continue;
4922
4923 case TUPLE2:
4924 if (load_counted_tuple(self, 2) < 0)
4925 break;
4926 continue;
4927
4928 case TUPLE3:
4929 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004930 break;
4931 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004932
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004933 case TUPLE:
4934 if (load_tuple(self) < 0)
4935 break;
4936 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004937
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004938 case EMPTY_LIST:
4939 if (load_empty_list(self) < 0)
4940 break;
4941 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004943 case LIST:
4944 if (load_list(self) < 0)
4945 break;
4946 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004948 case EMPTY_DICT:
4949 if (load_empty_dict(self) < 0)
4950 break;
4951 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004953 case DICT:
4954 if (load_dict(self) < 0)
4955 break;
4956 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004958 case OBJ:
4959 if (noload_obj(self) < 0)
4960 break;
4961 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004963 case INST:
4964 if (noload_inst(self) < 0)
4965 break;
4966 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004967
Tim Peterseab7db32003-02-13 18:24:14 +00004968 case NEWOBJ:
4969 if (noload_newobj(self) < 0)
4970 break;
4971 continue;
4972
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004973 case GLOBAL:
4974 if (noload_global(self) < 0)
4975 break;
4976 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004977
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004978 case APPEND:
4979 if (load_append(self) < 0)
4980 break;
4981 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004982
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004983 case APPENDS:
4984 if (load_appends(self) < 0)
4985 break;
4986 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004987
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004988 case BUILD:
4989 if (noload_build(self) < 0)
4990 break;
4991 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004992
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004993 case DUP:
4994 if (load_dup(self) < 0)
4995 break;
4996 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004997
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004998 case BINGET:
4999 if (load_binget(self) < 0)
5000 break;
5001 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005002
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005003 case LONG_BINGET:
5004 if (load_long_binget(self) < 0)
5005 break;
5006 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005007
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005008 case GET:
5009 if (load_get(self) < 0)
5010 break;
5011 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005012
Tim Peters2d629652003-02-04 05:06:17 +00005013 case EXT1:
5014 if (noload_extension(self, 1) < 0)
5015 break;
5016 continue;
5017
5018 case EXT2:
5019 if (noload_extension(self, 2) < 0)
5020 break;
5021 continue;
5022
5023 case EXT4:
5024 if (noload_extension(self, 4) < 0)
5025 break;
5026 continue;
5027
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005028 case MARK:
5029 if (load_mark(self) < 0)
5030 break;
5031 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005032
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005033 case BINPUT:
5034 if (load_binput(self) < 0)
5035 break;
5036 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005037
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005038 case LONG_BINPUT:
5039 if (load_long_binput(self) < 0)
5040 break;
5041 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00005042
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005043 case PUT:
5044 if (load_put(self) < 0)
5045 break;
5046 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005047
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005048 case POP:
5049 if (load_pop(self) < 0)
5050 break;
5051 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005052
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005053 case POP_MARK:
5054 if (load_pop_mark(self) < 0)
5055 break;
5056 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005057
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005058 case SETITEM:
5059 if (load_setitem(self) < 0)
5060 break;
5061 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005062
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005063 case SETITEMS:
5064 if (load_setitems(self) < 0)
5065 break;
5066 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005067
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005068 case STOP:
5069 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005070
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005071 case PERSID:
5072 if (load_persid(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 BINPERSID:
5077 if (load_binpersid(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 REDUCE:
5082 if (noload_reduce(self) < 0)
5083 break;
5084 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005085
Tim Peters4190fb82003-02-02 16:09:05 +00005086 case PROTO:
5087 if (load_proto(self) < 0)
5088 break;
5089 continue;
5090
Tim Peters3c67d792003-02-02 17:59:11 +00005091 case NEWTRUE:
5092 if (load_bool(self, Py_True) < 0)
5093 break;
5094 continue;
5095
5096 case NEWFALSE:
5097 if (load_bool(self, Py_False) < 0)
5098 break;
5099 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005100 default:
Tim Peterscba30e22003-02-01 06:24:36 +00005101 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005102 "invalid load key, '%s'.",
5103 "c", s[0]);
5104 return NULL;
5105 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005106
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005107 break;
5108 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005109
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005110 if ((err = PyErr_Occurred())) {
5111 if (err == PyExc_EOFError) {
5112 PyErr_SetNone(PyExc_EOFError);
5113 }
5114 return NULL;
5115 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005116
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005117 PDATA_POP(self->stack, val);
5118 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005119}
Tim Peters84e87f32001-03-17 04:50:51 +00005120
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005121
Guido van Rossum60456fd1997-04-09 17:36:32 +00005122static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005123Unpickler_load(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005124{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005125 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005126}
5127
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005128static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005129Unpickler_noload(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005130{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005131 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005132}
5133
Guido van Rossum60456fd1997-04-09 17:36:32 +00005134
5135static struct PyMethodDef Unpickler_methods[] = {
Georg Brandl96a8c392006-05-29 21:04:52 +00005136 {"load", (PyCFunction)Unpickler_load, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005137 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005138 },
Georg Brandl96a8c392006-05-29 21:04:52 +00005139 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005140 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005141 "noload() -- not load a pickle, but go through most of the motions\n"
5142 "\n"
5143 "This function can be used to read past a pickle without instantiating\n"
5144 "any objects or importing any modules. It can also be used to find all\n"
5145 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00005146 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005147 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00005148 {NULL, NULL} /* sentinel */
5149};
5150
5151
5152static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00005153newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005154{
5155 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005156
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005157 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005158 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005160 self->file = NULL;
5161 self->arg = NULL;
5162 self->stack = (Pdata*)Pdata_New();
5163 self->pers_func = NULL;
5164 self->last_string = NULL;
5165 self->marks = NULL;
5166 self->num_marks = 0;
5167 self->marks_size = 0;
5168 self->buf_size = 0;
5169 self->read = NULL;
5170 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005171 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005172
Tim Peterscba30e22003-02-01 06:24:36 +00005173 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005174 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005175
Neal Norwitzb59d08c2006-07-22 16:20:49 +00005176 if (!self->stack)
5177 goto err;
5178
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005179 Py_INCREF(f);
5180 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005181
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005182 /* Set read, readline based on type of f */
5183 if (PyFile_Check(f)) {
5184 self->fp = PyFile_AsFile(f);
5185 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00005186 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005187 "I/O operation on closed file");
5188 goto err;
5189 }
5190 self->read_func = read_file;
5191 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00005192 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005193 else if (PycStringIO_InputCheck(f)) {
5194 self->fp = NULL;
5195 self->read_func = read_cStringIO;
5196 self->readline_func = readline_cStringIO;
5197 }
5198 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00005199
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005200 self->fp = NULL;
5201 self->read_func = read_other;
5202 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005203
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005204 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
5205 (self->read = PyObject_GetAttr(f, read_str)))) {
5206 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00005207 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005208 "argument must have 'read' and "
5209 "'readline' attributes" );
5210 goto err;
5211 }
5212 }
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005213 PyObject_GC_Track(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005215 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005217 err:
5218 Py_DECREF((PyObject *)self);
5219 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005220}
5221
5222
5223static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005224get_Unpickler(PyObject *self, PyObject *file)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005225{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005226 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005227}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005228
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005229
Guido van Rossum60456fd1997-04-09 17:36:32 +00005230static void
Tim Peterscba30e22003-02-01 06:24:36 +00005231Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005232{
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005233 PyObject_GC_UnTrack((PyObject *)self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005234 Py_XDECREF(self->readline);
5235 Py_XDECREF(self->read);
5236 Py_XDECREF(self->file);
5237 Py_XDECREF(self->memo);
5238 Py_XDECREF(self->stack);
5239 Py_XDECREF(self->pers_func);
5240 Py_XDECREF(self->arg);
5241 Py_XDECREF(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00005242 Py_XDECREF(self->find_class);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005243
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005244 if (self->marks) {
5245 free(self->marks);
5246 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005247
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005248 if (self->buf_size) {
5249 free(self->buf);
5250 }
Tim Peters84e87f32001-03-17 04:50:51 +00005251
Tim Peters3cfe7542003-05-21 21:29:48 +00005252 self->ob_type->tp_free((PyObject *)self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005253}
5254
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005255static int
5256Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
5257{
Thomas Woutersc6e55062006-04-15 21:47:09 +00005258 Py_VISIT(self->readline);
5259 Py_VISIT(self->read);
5260 Py_VISIT(self->file);
5261 Py_VISIT(self->memo);
5262 Py_VISIT(self->stack);
5263 Py_VISIT(self->pers_func);
5264 Py_VISIT(self->arg);
5265 Py_VISIT(self->last_string);
5266 Py_VISIT(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005267 return 0;
5268}
5269
5270static int
5271Unpickler_clear(Unpicklerobject *self)
5272{
Thomas Woutersedf17d82006-04-15 17:28:34 +00005273 Py_CLEAR(self->readline);
5274 Py_CLEAR(self->read);
5275 Py_CLEAR(self->file);
5276 Py_CLEAR(self->memo);
5277 Py_CLEAR(self->stack);
5278 Py_CLEAR(self->pers_func);
5279 Py_CLEAR(self->arg);
5280 Py_CLEAR(self->last_string);
5281 Py_CLEAR(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005282 return 0;
5283}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005284
5285static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005286Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005287{
5288 if (!strcmp(name, "persistent_load")) {
5289 if (!self->pers_func) {
5290 PyErr_SetString(PyExc_AttributeError, name);
5291 return NULL;
5292 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005294 Py_INCREF(self->pers_func);
5295 return self->pers_func;
5296 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005297
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005298 if (!strcmp(name, "find_global")) {
5299 if (!self->find_class) {
5300 PyErr_SetString(PyExc_AttributeError, name);
5301 return NULL;
5302 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005304 Py_INCREF(self->find_class);
5305 return self->find_class;
5306 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005307
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005308 if (!strcmp(name, "memo")) {
5309 if (!self->memo) {
5310 PyErr_SetString(PyExc_AttributeError, name);
5311 return NULL;
5312 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005314 Py_INCREF(self->memo);
5315 return self->memo;
5316 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005317
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005318 if (!strcmp(name, "UnpicklingError")) {
5319 Py_INCREF(UnpicklingError);
5320 return UnpicklingError;
5321 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005322
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005323 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005324}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005325
Guido van Rossum60456fd1997-04-09 17:36:32 +00005326
5327static int
Tim Peterscba30e22003-02-01 06:24:36 +00005328Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005329{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005331 if (!strcmp(name, "persistent_load")) {
5332 Py_XDECREF(self->pers_func);
5333 self->pers_func = value;
5334 Py_XINCREF(value);
5335 return 0;
5336 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005338 if (!strcmp(name, "find_global")) {
5339 Py_XDECREF(self->find_class);
5340 self->find_class = value;
5341 Py_XINCREF(value);
5342 return 0;
5343 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005344
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005345 if (! value) {
5346 PyErr_SetString(PyExc_TypeError,
5347 "attribute deletion is not supported");
5348 return -1;
5349 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005350
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005351 if (strcmp(name, "memo") == 0) {
5352 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005353 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005354 "memo must be a dictionary");
5355 return -1;
5356 }
5357 Py_XDECREF(self->memo);
5358 self->memo = value;
5359 Py_INCREF(value);
5360 return 0;
5361 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005362
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005363 PyErr_SetString(PyExc_AttributeError, name);
5364 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005365}
5366
Tim Peters5bd2a792003-02-01 16:45:06 +00005367/* ---------------------------------------------------------------------------
5368 * Module-level functions.
5369 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005370
Martin v. Löwis544f1192004-07-27 05:22:33 +00005371/* dump(obj, file, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005372static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005373cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005374{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005375 static char *kwlist[] = {"obj", "file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005376 PyObject *ob, *file, *res = NULL;
5377 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005378 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005379
Martin v. Löwis544f1192004-07-27 05:22:33 +00005380 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5381 &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005382 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005383
Tim Peters5bd2a792003-02-01 16:45:06 +00005384 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005385 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005386
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005387 if (dump(pickler, ob) < 0)
5388 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005389
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005390 Py_INCREF(Py_None);
5391 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005393 finally:
5394 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005396 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005397}
5398
5399
Martin v. Löwis544f1192004-07-27 05:22:33 +00005400/* dumps(obj, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005401static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005402cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005403{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005404 static char *kwlist[] = {"obj", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005405 PyObject *ob, *file = 0, *res = NULL;
5406 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005407 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005408
Martin v. Löwis544f1192004-07-27 05:22:33 +00005409 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5410 &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005411 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005412
Tim Peterscba30e22003-02-01 06:24:36 +00005413 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005414 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005415
Tim Peters5bd2a792003-02-01 16:45:06 +00005416 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005417 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005418
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005419 if (dump(pickler, ob) < 0)
5420 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005421
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005422 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005423
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005424 finally:
5425 Py_XDECREF(pickler);
5426 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005427
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005428 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005429}
5430
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005431
Tim Peters5bd2a792003-02-01 16:45:06 +00005432/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005433static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +00005434cpm_load(PyObject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005435{
5436 Unpicklerobject *unpickler = 0;
Georg Brandl96a8c392006-05-29 21:04:52 +00005437 PyObject *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005438
Tim Peterscba30e22003-02-01 06:24:36 +00005439 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005440 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005441
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005442 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005443
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005444 finally:
5445 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005446
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005447 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005448}
5449
5450
Tim Peters5bd2a792003-02-01 16:45:06 +00005451/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005452static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005453cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005454{
5455 PyObject *ob, *file = 0, *res = NULL;
5456 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005457
Tim Peterscba30e22003-02-01 06:24:36 +00005458 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005459 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005460
Tim Peterscba30e22003-02-01 06:24:36 +00005461 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005462 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005463
Tim Peterscba30e22003-02-01 06:24:36 +00005464 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005465 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005466
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005467 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005468
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005469 finally:
5470 Py_XDECREF(file);
5471 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005472
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005473 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005474}
5475
5476
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005477PyDoc_STRVAR(Unpicklertype__doc__,
5478"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005479
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005480static PyTypeObject Unpicklertype = {
5481 PyObject_HEAD_INIT(NULL)
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005482 0, /*ob_size*/
5483 "cPickle.Unpickler", /*tp_name*/
5484 sizeof(Unpicklerobject), /*tp_basicsize*/
5485 0,
5486 (destructor)Unpickler_dealloc, /* tp_dealloc */
5487 0, /* tp_print */
5488 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5489 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5490 0, /* tp_compare */
5491 0, /* tp_repr */
5492 0, /* tp_as_number */
5493 0, /* tp_as_sequence */
5494 0, /* tp_as_mapping */
5495 0, /* tp_hash */
5496 0, /* tp_call */
5497 0, /* tp_str */
5498 0, /* tp_getattro */
5499 0, /* tp_setattro */
5500 0, /* tp_as_buffer */
5501 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5502 Unpicklertype__doc__, /* tp_doc */
5503 (traverseproc)Unpickler_traverse, /* tp_traverse */
5504 (inquiry)Unpickler_clear, /* tp_clear */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005505};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005506
Guido van Rossum60456fd1997-04-09 17:36:32 +00005507static struct PyMethodDef cPickle_methods[] = {
Martin v. Löwis544f1192004-07-27 05:22:33 +00005508 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5509 PyDoc_STR("dump(obj, file, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005510 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005511 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005512 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005513 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005514
Martin v. Löwis544f1192004-07-27 05:22:33 +00005515 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5516 PyDoc_STR("dumps(obj, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005517 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005518 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005519 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005520 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005521
Georg Brandl96a8c392006-05-29 21:04:52 +00005522 {"load", (PyCFunction)cpm_load, METH_O,
Neal Norwitz200788c2002-08-13 22:20:41 +00005523 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005524
Neal Norwitzb0493252002-03-31 14:44:22 +00005525 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005526 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005527
Martin v. Löwis544f1192004-07-27 05:22:33 +00005528 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5529 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005530 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005531 "This takes a file-like object for writing a pickle data stream.\n"
5532 "The optional proto argument tells the pickler to use the given\n"
5533 "protocol; supported protocols are 0, 1, 2. The default\n"
5534 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5535 "only protocol that can be written to a file opened in text\n"
5536 "mode and read back successfully. When using a protocol higher\n"
5537 "than 0, make sure the file is opened in binary mode, both when\n"
5538 "pickling and unpickling.)\n"
5539 "\n"
5540 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5541 "more efficient than protocol 1.\n"
5542 "\n"
5543 "Specifying a negative protocol version selects the highest\n"
5544 "protocol version supported. The higher the protocol used, the\n"
5545 "more recent the version of Python needed to read the pickle\n"
5546 "produced.\n"
5547 "\n"
5548 "The file parameter must have a write() method that accepts a single\n"
5549 "string argument. It can thus be an open file object, a StringIO\n"
5550 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005551 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005552
Georg Brandl96a8c392006-05-29 21:04:52 +00005553 {"Unpickler", (PyCFunction)get_Unpickler, METH_O,
Tim Peters5bd2a792003-02-01 16:45:06 +00005554 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5555
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005556 { NULL, NULL }
5557};
5558
Guido van Rossum60456fd1997-04-09 17:36:32 +00005559static int
Tim Peterscba30e22003-02-01 06:24:36 +00005560init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005561{
5562 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005563
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00005564#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005565
Tim Peters3cfe7542003-05-21 21:29:48 +00005566 if (PyType_Ready(&Unpicklertype) < 0)
5567 return -1;
5568 if (PyType_Ready(&Picklertype) < 0)
5569 return -1;
5570
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005571 INIT_STR(__class__);
5572 INIT_STR(__getinitargs__);
5573 INIT_STR(__dict__);
5574 INIT_STR(__getstate__);
5575 INIT_STR(__setstate__);
5576 INIT_STR(__name__);
5577 INIT_STR(__main__);
5578 INIT_STR(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00005579 INIT_STR(__reduce_ex__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005580 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005581 INIT_STR(append);
5582 INIT_STR(read);
5583 INIT_STR(readline);
5584 INIT_STR(copy_reg);
5585 INIT_STR(dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005586
Tim Peterscba30e22003-02-01 06:24:36 +00005587 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005588 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005589
Tim Peters1f1b2d22003-02-01 02:16:37 +00005590 /* This is special because we want to use a different
5591 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005592 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005593 if (!dispatch_table) return -1;
5594
5595 extension_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005596 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005597 if (!extension_registry) return -1;
5598
5599 inverted_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005600 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005601 if (!inverted_registry) return -1;
5602
5603 extension_cache = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005604 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005605 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005607 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005608
Tim Peters731098b2003-02-04 20:56:09 +00005609 if (!(empty_tuple = PyTuple_New(0)))
5610 return -1;
5611
5612 two_tuple = PyTuple_New(2);
5613 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005614 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005615 /* We use this temp container with no regard to refcounts, or to
5616 * keeping containees alive. Exempt from GC, because we don't
5617 * want anything looking at two_tuple() by magic.
5618 */
5619 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005620
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005621 /* Ugh */
5622 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5623 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5624 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005625
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005626 if (!( t=PyDict_New())) return -1;
5627 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005628 "def __str__(self):\n"
5629 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5630 Py_file_input,
5631 module_dict, t) )) return -1;
5632 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005633
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005634 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005635 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005636 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005637
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005638 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005639
Tim Peterscba30e22003-02-01 06:24:36 +00005640 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005641 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005642 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005643 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005644
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005645 if (!( t=PyDict_New())) return -1;
5646 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005647 "def __str__(self):\n"
5648 " a=self.args\n"
5649 " a=a and type(a[0]) or '(what)'\n"
5650 " return 'Cannot pickle %s objects' % a\n"
5651 , Py_file_input,
5652 module_dict, t) )) return -1;
5653 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005654
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005655 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005656 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005657 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005658
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005659 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005660
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005661 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005662 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005663 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005664
Martin v. Löwis658009a2002-09-16 17:26:24 +00005665 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5666 UnpicklingError, NULL)))
5667 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005669 if (PyDict_SetItemString(module_dict, "PickleError",
5670 PickleError) < 0)
5671 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005672
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005673 if (PyDict_SetItemString(module_dict, "PicklingError",
5674 PicklingError) < 0)
5675 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005676
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005677 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5678 UnpicklingError) < 0)
5679 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005680
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005681 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5682 UnpickleableError) < 0)
5683 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005684
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005685 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5686 BadPickleGet) < 0)
5687 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005689 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005691 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005692}
5693
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005694#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5695#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005696#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005697PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005698initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005699{
5700 PyObject *m, *d, *di, *v, *k;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005701 Py_ssize_t i;
Tim Peters5b7da392003-02-04 00:21:07 +00005702 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005703 PyObject *format_version;
5704 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005706 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005707 Unpicklertype.ob_type = &PyType_Type;
5708 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005709
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005710 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005711 * so we're forced to use a temporary dictionary. :(
5712 */
5713 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005714 if (!di) return;
5715 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005716
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005717 /* Create the module and add the functions */
5718 m = Py_InitModule4("cPickle", cPickle_methods,
5719 cPickle_module_documentation,
5720 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00005721 if (m == NULL)
5722 return;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005724 /* Add some symbolic constants to the module */
5725 d = PyModule_GetDict(m);
Tim Peters5b7da392003-02-04 00:21:07 +00005726 v = PyString_FromString(rev);
5727 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005728 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005729
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005730 /* Copy data from di. Waaa. */
5731 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5732 if (PyObject_SetItem(d, k, v) < 0) {
5733 Py_DECREF(di);
5734 return;
5735 }
5736 }
5737 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005738
Tim Peters8587b3c2003-02-13 15:44:41 +00005739 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
5740 if (i < 0)
5741 return;
5742
Tim Peters5b7da392003-02-04 00:21:07 +00005743 /* These are purely informational; no code uses them. */
5744 /* File format version we write. */
5745 format_version = PyString_FromString("2.0");
5746 /* Format versions we can read. */
5747 compatible_formats = Py_BuildValue("[sssss]",
5748 "1.0", /* Original protocol 0 */
5749 "1.1", /* Protocol 0 + INST */
5750 "1.2", /* Original protocol 1 */
5751 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005752 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005753 PyDict_SetItemString(d, "format_version", format_version);
5754 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5755 Py_XDECREF(format_version);
5756 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005757}