blob: 98ab500aa32dd5f51615d6b3abb1d5fd36827df8 [file] [log] [blame]
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001#include "Python.h"
2#include "cStringIO.h"
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00003#include "structmember.h"
Guido van Rossum2f4caa41997-01-06 22:59:08 +00004
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005PyDoc_STRVAR(cPickle_module_documentation,
Tim Peters64c04d12003-02-01 06:27:59 +00006"C implementation and optimization of the Python pickle module.");
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00007
Guido van Rossum142eeb81997-08-13 03:14:41 +00008#ifndef Py_eval_input
9#include <graminit.h>
10#define Py_eval_input eval_input
Guido van Rossumc6ef2041997-08-21 02:30:45 +000011#endif /* Py_eval_input */
Guido van Rossum142eeb81997-08-13 03:14:41 +000012
Guido van Rossum60456fd1997-04-09 17:36:32 +000013#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))
Guido van Rossum2f4caa41997-01-06 22:59:08 +000014
Guido van Rossum60456fd1997-04-09 17:36:32 +000015#define WRITE_BUF_SIZE 256
16
Tim Peters5bd2a792003-02-01 16:45:06 +000017/* Bump this when new opcodes are added to the pickle protocol. */
Tim Peters8587b3c2003-02-13 15:44:41 +000018#define HIGHEST_PROTOCOL 2
Tim Peters5bd2a792003-02-01 16:45:06 +000019
Tim Peters797ec242003-02-01 06:22:36 +000020/*
21 * Pickle opcodes. These must be kept in synch with pickle.py. Extensive
22 * docs are in pickletools.py.
23 */
Guido van Rossum60456fd1997-04-09 17:36:32 +000024#define MARK '('
25#define STOP '.'
26#define POP '0'
27#define POP_MARK '1'
28#define DUP '2'
29#define FLOAT 'F'
Guido van Rossum60456fd1997-04-09 17:36:32 +000030#define BINFLOAT 'G'
Guido van Rossum60456fd1997-04-09 17:36:32 +000031#define INT 'I'
32#define BININT 'J'
33#define BININT1 'K'
34#define LONG 'L'
35#define BININT2 'M'
36#define NONE 'N'
37#define PERSID 'P'
38#define BINPERSID 'Q'
39#define REDUCE 'R'
40#define STRING 'S'
41#define BINSTRING 'T'
Guido van Rossum2f4caa41997-01-06 22:59:08 +000042#define SHORT_BINSTRING 'U'
Guido van Rossum5fccb7c2000-03-10 23:11:40 +000043#define UNICODE 'V'
44#define BINUNICODE 'X'
Guido van Rossum60456fd1997-04-09 17:36:32 +000045#define APPEND 'a'
46#define BUILD 'b'
47#define GLOBAL 'c'
48#define DICT 'd'
49#define EMPTY_DICT '}'
50#define APPENDS 'e'
51#define GET 'g'
52#define BINGET 'h'
53#define INST 'i'
54#define LONG_BINGET 'j'
55#define LIST 'l'
56#define EMPTY_LIST ']'
57#define OBJ 'o'
58#define PUT 'p'
59#define BINPUT 'q'
60#define LONG_BINPUT 'r'
61#define SETITEM 's'
62#define TUPLE 't'
63#define EMPTY_TUPLE ')'
64#define SETITEMS 'u'
Tim Peters797ec242003-02-01 06:22:36 +000065
66/* Protocol 2. */
67#define PROTO '\x80' /* identify pickle protocol */
68#define NEWOBJ '\x81' /* build object by applying cls.__new__ to argtuple */
69#define EXT1 '\x82' /* push object from extension registry; 1-byte index */
70#define EXT2 '\x83' /* ditto, but 2-byte index */
71#define EXT4 '\x84' /* ditto, but 4-byte index */
72#define TUPLE1 '\x85' /* build 1-tuple from stack top */
73#define TUPLE2 '\x86' /* build 2-tuple from two topmost stack items */
74#define TUPLE3 '\x87' /* build 3-tuple from three topmost stack items */
75#define NEWTRUE '\x88' /* push True */
76#define NEWFALSE '\x89' /* push False */
77#define LONG1 '\x8a' /* push long from < 256 bytes */
78#define LONG4 '\x8b' /* push really big long */
79
80/* There aren't opcodes -- they're ways to pickle bools before protocol 2,
81 * so that unpicklers written before bools were introduced unpickle them
82 * as ints, but unpicklers after can recognize that bools were intended.
83 * Note that protocol 2 added direct ways to pickle bools.
84 */
Jack Jansen3a967022002-06-26 20:40:42 +000085#undef TRUE
Guido van Rossume2763392002-04-05 19:30:08 +000086#define TRUE "I01\n"
Jack Jansen3a967022002-06-26 20:40:42 +000087#undef FALSE
Guido van Rossume2763392002-04-05 19:30:08 +000088#define FALSE "I00\n"
Guido van Rossum77f6a652002-04-03 22:41:51 +000089
Tim Peters1092d642003-02-11 21:06:20 +000090/* Keep in synch with pickle.Pickler._BATCHSIZE. This is how many elements
Tim Peters42f08ac2003-02-11 22:43:24 +000091 * batch_list/dict() pumps out before doing APPENDS/SETITEMS. Nothing will
92 * break if this gets out of synch with pickle.py, but it's unclear that
93 * would help anything either.
Tim Peters1092d642003-02-11 21:06:20 +000094 */
95#define BATCHSIZE 1000
96
Guido van Rossum60456fd1997-04-09 17:36:32 +000097static char MARKv = MARK;
Guido van Rossum2f4caa41997-01-06 22:59:08 +000098
Guido van Rossumc03158b1999-06-09 15:23:31 +000099static PyObject *PickleError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000100static PyObject *PicklingError;
Guido van Rossumc03158b1999-06-09 15:23:31 +0000101static PyObject *UnpickleableError;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000102static PyObject *UnpicklingError;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000103static PyObject *BadPickleGet;
104
Tim Peters5b7da392003-02-04 00:21:07 +0000105/* As the name says, an empty tuple. */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000106static PyObject *empty_tuple;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000107
Tim Peters5b7da392003-02-04 00:21:07 +0000108/* copy_reg.dispatch_table, {type_object: pickling_function} */
109static PyObject *dispatch_table;
110
111/* For EXT[124] opcodes. */
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000112/* copy_reg._extension_registry, {(module_name, function_name): code} */
Tim Peters5b7da392003-02-04 00:21:07 +0000113static PyObject *extension_registry;
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000114/* copy_reg._inverted_registry, {code: (module_name, function_name)} */
Tim Peters5b7da392003-02-04 00:21:07 +0000115static PyObject *inverted_registry;
Guido van Rossumd4b920c2003-02-04 01:54:49 +0000116/* copy_reg._extension_cache, {code: object} */
Tim Peters5b7da392003-02-04 00:21:07 +0000117static PyObject *extension_cache;
118
Tim Peters731098b2003-02-04 20:56:09 +0000119/* For looking up name pairs in copy_reg._extension_registry. */
120static PyObject *two_tuple;
121
Guido van Rossum60456fd1997-04-09 17:36:32 +0000122static PyObject *__class___str, *__getinitargs___str, *__dict___str,
123 *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
Guido van Rossumb289b872003-02-19 01:45:13 +0000124 *__reduce_ex___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000125 *write_str, *append_str,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000126 *read_str, *readline_str, *__main___str,
Tim Peters1f1b2d22003-02-01 02:16:37 +0000127 *copy_reg_str, *dispatch_table_str;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000128
Guido van Rossum053b8df1998-11-25 16:18:00 +0000129/*************************************************************************
130 Internal Data type for pickle data. */
131
132typedef struct {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000133 PyObject_HEAD
Tim Peters1d63c9f2003-02-02 20:29:39 +0000134 int length; /* number of initial slots in data currently used */
135 int size; /* number of slots in data allocated */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000136 PyObject **data;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000137} Pdata;
138
Tim Peters84e87f32001-03-17 04:50:51 +0000139static void
Tim Peterscba30e22003-02-01 06:24:36 +0000140Pdata_dealloc(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000141{
142 int i;
143 PyObject **p;
Tim Peterscba30e22003-02-01 06:24:36 +0000144
Tim Peters1d63c9f2003-02-02 20:29:39 +0000145 for (i = self->length, p = self->data; --i >= 0; p++) {
146 Py_DECREF(*p);
147 }
148 if (self->data)
149 free(self->data);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000150 PyObject_Del(self);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000151}
152
153static PyTypeObject PdataType = {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000154 PyObject_HEAD_INIT(NULL) 0, "cPickle.Pdata", sizeof(Pdata), 0,
155 (destructor)Pdata_dealloc,
156 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""
Guido van Rossum053b8df1998-11-25 16:18:00 +0000157};
158
159#define Pdata_Check(O) ((O)->ob_type == &PdataType)
160
161static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000162Pdata_New(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000163{
164 Pdata *self;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000165
Tim Peters1d63c9f2003-02-02 20:29:39 +0000166 if (!(self = PyObject_New(Pdata, &PdataType)))
167 return NULL;
168 self->size = 8;
169 self->length = 0;
170 self->data = malloc(self->size * sizeof(PyObject*));
171 if (self->data)
172 return (PyObject*)self;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000173 Py_DECREF(self);
174 return PyErr_NoMemory();
Guido van Rossum053b8df1998-11-25 16:18:00 +0000175}
176
Tim Peters84e87f32001-03-17 04:50:51 +0000177static int
Tim Peterscba30e22003-02-01 06:24:36 +0000178stackUnderflow(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000179{
180 PyErr_SetString(UnpicklingError, "unpickling stack underflow");
181 return -1;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000182}
183
Tim Peters1d63c9f2003-02-02 20:29:39 +0000184/* Retain only the initial clearto items. If clearto >= the current
185 * number of items, this is a (non-erroneous) NOP.
186 */
Guido van Rossum053b8df1998-11-25 16:18:00 +0000187static int
Tim Peterscba30e22003-02-01 06:24:36 +0000188Pdata_clear(Pdata *self, int clearto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000189{
190 int i;
191 PyObject **p;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000193 if (clearto < 0) return stackUnderflow();
194 if (clearto >= self->length) return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000195
Tim Peters1d63c9f2003-02-02 20:29:39 +0000196 for (i = self->length, p = self->data + clearto;
197 --i >= clearto;
198 p++) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000199 Py_CLEAR(*p);
Tim Peters1d63c9f2003-02-02 20:29:39 +0000200 }
201 self->length = clearto;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000202
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000203 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000204}
205
Tim Peters84e87f32001-03-17 04:50:51 +0000206static int
Tim Peterscba30e22003-02-01 06:24:36 +0000207Pdata_grow(Pdata *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000208{
Tim Peters1d63c9f2003-02-02 20:29:39 +0000209 int bigger;
210 size_t nbytes;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000211 PyObject **tmp;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000212
Tim Peters1d63c9f2003-02-02 20:29:39 +0000213 bigger = self->size << 1;
Tim Peterse0a39072003-02-03 15:45:56 +0000214 if (bigger <= 0) /* was 0, or new value overflows */
Tim Peters1d63c9f2003-02-02 20:29:39 +0000215 goto nomemory;
216 if ((int)(size_t)bigger != bigger)
217 goto nomemory;
218 nbytes = (size_t)bigger * sizeof(PyObject *);
219 if (nbytes / sizeof(PyObject *) != (size_t)bigger)
220 goto nomemory;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000221 tmp = realloc(self->data, nbytes);
222 if (tmp == NULL)
Tim Peters1d63c9f2003-02-02 20:29:39 +0000223 goto nomemory;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000224 self->data = tmp;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000225 self->size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000226 return 0;
Tim Peters1d63c9f2003-02-02 20:29:39 +0000227
228 nomemory:
Tim Peters1d63c9f2003-02-02 20:29:39 +0000229 PyErr_NoMemory();
230 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000231}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000232
Tim Peterse0a39072003-02-03 15:45:56 +0000233/* D is a Pdata*. Pop the topmost element and store it into V, which
234 * must be an lvalue holding PyObject*. On stack underflow, UnpicklingError
Tim Peters1d63c9f2003-02-02 20:29:39 +0000235 * is raised and V is set to NULL. D and V may be evaluated several times.
236 */
237#define PDATA_POP(D, V) { \
Tim Peterse0a39072003-02-03 15:45:56 +0000238 if ((D)->length) \
239 (V) = (D)->data[--((D)->length)]; \
240 else { \
241 PyErr_SetString(UnpicklingError, "bad pickle data"); \
242 (V) = NULL; \
243 } \
Guido van Rossum053b8df1998-11-25 16:18:00 +0000244}
245
Tim Peterse0a39072003-02-03 15:45:56 +0000246/* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata*
247 * D. If the Pdata stack can't be grown to hold the new value, both
248 * raise MemoryError and execute "return ER". The difference is in ownership
249 * of O after: _PUSH transfers ownership of O from the caller to the stack
250 * (no incref of O is done, and in case of error O is decrefed), while
251 * _APPEND pushes a new reference.
252 */
253
254/* Push O on stack D, giving ownership of O to the stack. */
255#define PDATA_PUSH(D, O, ER) { \
256 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
257 Pdata_grow((Pdata*)(D)) < 0) { \
258 Py_DECREF(O); \
259 return ER; \
260 } \
261 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
262}
263
264/* Push O on stack D, pushing a new reference. */
265#define PDATA_APPEND(D, O, ER) { \
266 if (((Pdata*)(D))->length == ((Pdata*)(D))->size && \
267 Pdata_grow((Pdata*)(D)) < 0) \
268 return ER; \
269 Py_INCREF(O); \
270 ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O); \
271}
272
273
Guido van Rossum053b8df1998-11-25 16:18:00 +0000274static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000275Pdata_popTuple(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000276{
277 PyObject *r;
278 int i, j, l;
Tim Peterscba30e22003-02-01 06:24:36 +0000279
Tim Peters1d63c9f2003-02-02 20:29:39 +0000280 l = self->length-start;
281 r = PyTuple_New(l);
282 if (r == NULL)
283 return NULL;
284 for (i = start, j = 0 ; j < l; i++, j++)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000285 PyTuple_SET_ITEM(r, j, self->data[i]);
Tim Peterscba30e22003-02-01 06:24:36 +0000286
Tim Peters1d63c9f2003-02-02 20:29:39 +0000287 self->length = start;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000288 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000289}
290
291static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000292Pdata_popList(Pdata *self, int start)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000293{
294 PyObject *r;
295 int i, j, l;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000297 l=self->length-start;
298 if (!( r=PyList_New(l))) return NULL;
299 for (i=start, j=0 ; j < l; i++, j++)
300 PyList_SET_ITEM(r, j, self->data[i]);
Guido van Rossum053b8df1998-11-25 16:18:00 +0000301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000302 self->length=start;
303 return r;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000304}
305
Guido van Rossum053b8df1998-11-25 16:18:00 +0000306/*************************************************************************/
307
308#define ARG_TUP(self, o) { \
309 if (self->arg || (self->arg=PyTuple_New(1))) { \
310 Py_XDECREF(PyTuple_GET_ITEM(self->arg,0)); \
311 PyTuple_SET_ITEM(self->arg,0,o); \
312 } \
313 else { \
314 Py_DECREF(o); \
315 } \
316}
317
318#define FREE_ARG_TUP(self) { \
319 if (self->arg->ob_refcnt > 1) { \
320 Py_DECREF(self->arg); \
321 self->arg=NULL; \
322 } \
323 }
324
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000325typedef struct Picklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000326 PyObject_HEAD
327 FILE *fp;
328 PyObject *write;
329 PyObject *file;
330 PyObject *memo;
331 PyObject *arg;
332 PyObject *pers_func;
333 PyObject *inst_pers_func;
Tim Peters797ec242003-02-01 06:22:36 +0000334
335 /* pickle protocol number, >= 0 */
336 int proto;
337
338 /* bool, true if proto > 0 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000339 int bin;
Tim Peters797ec242003-02-01 06:22:36 +0000340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000341 int fast; /* Fast mode doesn't save in memo, don't use if circ ref */
Martin v. Löwis5a395302002-08-04 08:20:23 +0000342 int nesting;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000343 int (*write_func)(struct Picklerobject *, const char *, Py_ssize_t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000344 char *write_buf;
345 int buf_size;
346 PyObject *dispatch_table;
347 int fast_container; /* count nested container dumps */
348 PyObject *fast_memo;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000349} Picklerobject;
350
Barry Warsaw52acb492001-12-21 20:04:22 +0000351#ifndef PY_CPICKLE_FAST_LIMIT
352#define PY_CPICKLE_FAST_LIMIT 50
353#endif
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000354
Jeremy Hylton938ace62002-07-17 16:30:39 +0000355static PyTypeObject Picklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000356
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000357typedef struct Unpicklerobject {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000358 PyObject_HEAD
359 FILE *fp;
360 PyObject *file;
361 PyObject *readline;
362 PyObject *read;
363 PyObject *memo;
364 PyObject *arg;
365 Pdata *stack;
366 PyObject *mark;
367 PyObject *pers_func;
368 PyObject *last_string;
369 int *marks;
370 int num_marks;
371 int marks_size;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000372 Py_ssize_t (*read_func)(struct Unpicklerobject *, char **, Py_ssize_t);
373 Py_ssize_t (*readline_func)(struct Unpicklerobject *, char **);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000374 int buf_size;
375 char *buf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000376 PyObject *find_class;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000377} Unpicklerobject;
Tim Peters84e87f32001-03-17 04:50:51 +0000378
Jeremy Hylton938ace62002-07-17 16:30:39 +0000379static PyTypeObject Unpicklertype;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000380
Thomas Wouters4789b3a2000-07-24 11:36:47 +0000381/* Forward decls that need the above structs */
382static int save(Picklerobject *, PyObject *, int);
383static int put2(Picklerobject *, PyObject *);
384
Guido van Rossumd385d591997-04-09 17:47:47 +0000385static
Guido van Rossum60456fd1997-04-09 17:36:32 +0000386PyObject *
Thomas Wouters3b6448f2000-07-22 23:56:07 +0000387cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)
388{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000389 va_list va;
390 PyObject *args=0, *retval=0;
391 va_start(va, format);
Tim Peterscba30e22003-02-01 06:24:36 +0000392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000393 if (format) args = Py_VaBuildValue(format, va);
394 va_end(va);
395 if (format && ! args) return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000396 if (stringformat && !(retval=PyString_FromString(stringformat)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000397 return NULL;
Tim Peterscba30e22003-02-01 06:24:36 +0000398
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000399 if (retval) {
400 if (args) {
401 PyObject *v;
402 v=PyString_Format(retval, args);
403 Py_DECREF(retval);
404 Py_DECREF(args);
405 if (! v) return NULL;
406 retval=v;
407 }
408 }
409 else
410 if (args) retval=args;
411 else {
412 PyErr_SetObject(ErrType,Py_None);
413 return NULL;
414 }
415 PyErr_SetObject(ErrType,retval);
416 Py_DECREF(retval);
417 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000418}
419
Tim Peters84e87f32001-03-17 04:50:51 +0000420static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000421write_file(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000422{
423 size_t nbyteswritten;
Tim Peters84e87f32001-03-17 04:50:51 +0000424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000425 if (s == NULL) {
426 return 0;
427 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000428
Martin v. Löwis18e16552006-02-15 17:27:45 +0000429 if (n > INT_MAX) {
430 /* String too large */
431 return -1;
432 }
433
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000434 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000435 nbyteswritten = fwrite(s, sizeof(char), n, self->fp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000436 Py_END_ALLOW_THREADS
Jeremy Hylton7fa4bfa2002-07-18 20:58:57 +0000437 if (nbyteswritten != (size_t)n) {
438 PyErr_SetFromErrno(PyExc_IOError);
439 return -1;
440 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000441
Martin v. Löwis18e16552006-02-15 17:27:45 +0000442 return (int)n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000443}
444
Tim Peters84e87f32001-03-17 04:50:51 +0000445static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000446write_cStringIO(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000447{
448 if (s == NULL) {
449 return 0;
450 }
Tim Peterscba30e22003-02-01 06:24:36 +0000451
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000452 if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {
453 return -1;
454 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000455
Martin v. Löwis18e16552006-02-15 17:27:45 +0000456 return (int)n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000457}
458
Tim Peters84e87f32001-03-17 04:50:51 +0000459static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000460write_none(Picklerobject *self, const char *s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000461{
462 if (s == NULL) return 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000463 if (n > INT_MAX) return -1;
464 return (int)n;
Guido van Rossum142eeb81997-08-13 03:14:41 +0000465}
466
Tim Peters84e87f32001-03-17 04:50:51 +0000467static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000468write_other(Picklerobject *self, const char *s, Py_ssize_t _n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000469{
470 PyObject *py_str = 0, *junk = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000471 int n;
Tim Peterscba30e22003-02-01 06:24:36 +0000472
Martin v. Löwis18e16552006-02-15 17:27:45 +0000473 if (_n > INT_MAX)
474 return -1;
475 n = (int)_n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000476 if (s == NULL) {
477 if (!( self->buf_size )) return 0;
Tim Peterscba30e22003-02-01 06:24:36 +0000478 py_str = PyString_FromStringAndSize(self->write_buf,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000479 self->buf_size);
Tim Peterscba30e22003-02-01 06:24:36 +0000480 if (!py_str)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000481 return -1;
482 }
483 else {
484 if (self->buf_size && (n + self->buf_size) > WRITE_BUF_SIZE) {
485 if (write_other(self, NULL, 0) < 0)
486 return -1;
487 }
Tim Peterscba30e22003-02-01 06:24:36 +0000488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000489 if (n > WRITE_BUF_SIZE) {
490 if (!( py_str =
Tim Peterscba30e22003-02-01 06:24:36 +0000491 PyString_FromStringAndSize(s, n)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000492 return -1;
493 }
494 else {
495 memcpy(self->write_buf + self->buf_size, s, n);
496 self->buf_size += n;
497 return n;
498 }
499 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000500
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000501 if (self->write) {
502 /* object with write method */
503 ARG_TUP(self, py_str);
504 if (self->arg) {
505 junk = PyObject_Call(self->write, self->arg, NULL);
506 FREE_ARG_TUP(self);
507 }
508 if (junk) Py_DECREF(junk);
509 else return -1;
510 }
511 else
512 PDATA_PUSH(self->file, py_str, -1);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000513
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000514 self->buf_size = 0;
515 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000516}
517
518
Martin v. Löwis18e16552006-02-15 17:27:45 +0000519static Py_ssize_t
520read_file(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000521{
522 size_t nbytesread;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000523
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000524 if (self->buf_size == 0) {
525 int size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000527 size = ((n < 32) ? 32 : n);
Tim Petersee1a53c2003-02-02 02:57:53 +0000528 if (!( self->buf = (char *)malloc(size))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000529 PyErr_NoMemory();
530 return -1;
531 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000533 self->buf_size = size;
534 }
535 else if (n > self->buf_size) {
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 }
Guido van Rossumddefaf32007-01-14 03:31:43 +0000714 c_value = PyInt_AsLong(value);
715 if (c_value == -1 && PyErr_Occurred())
716 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000718 if (!self->bin) {
719 s[0] = GET;
720 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
721 len = strlen(s);
722 }
723 else if (Pdata_Check(self->file)) {
724 if (write_other(self, NULL, 0) < 0) return -1;
725 PDATA_APPEND(self->file, mv, -1);
726 return 0;
727 }
728 else {
729 if (c_value < 256) {
730 s[0] = BINGET;
731 s[1] = (int)(c_value & 0xff);
732 len = 2;
733 }
734 else {
735 s[0] = LONG_BINGET;
736 s[1] = (int)(c_value & 0xff);
737 s[2] = (int)((c_value >> 8) & 0xff);
738 s[3] = (int)((c_value >> 16) & 0xff);
739 s[4] = (int)((c_value >> 24) & 0xff);
740 len = 5;
741 }
742 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000743
Tim Peters0bc93f52003-02-02 18:29:33 +0000744 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000745 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000746
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000747 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000748}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000749
Guido van Rossum60456fd1997-04-09 17:36:32 +0000750
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000751static int
Tim Peterscba30e22003-02-01 06:24:36 +0000752put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000753{
Tim Peterscba30e22003-02-01 06:24:36 +0000754 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000755 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000757 return put2(self, ob);
758}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000759
Guido van Rossum053b8df1998-11-25 16:18:00 +0000760
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000761static int
Tim Peterscba30e22003-02-01 06:24:36 +0000762put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000763{
764 char c_str[30];
765 int p;
766 size_t len;
767 int res = -1;
768 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000769
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000770 if (self->fast)
771 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000773 if ((p = PyDict_Size(self->memo)) < 0)
774 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000776 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000777 /* XXX Why?
778 * XXX And does "positive" really mean non-negative?
779 * XXX pickle.py starts with PUT index 0, not 1. This makes for
780 * XXX gratuitous differences between the pickling modules.
781 */
Tim Peterscba30e22003-02-01 06:24:36 +0000782 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000783
Tim Peterscba30e22003-02-01 06:24:36 +0000784 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000785 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000786
Tim Peterscba30e22003-02-01 06:24:36 +0000787 if (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000788 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000789
Tim Peterscba30e22003-02-01 06:24:36 +0000790 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000791 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000793 PyTuple_SET_ITEM(t, 0, memo_len);
794 Py_INCREF(memo_len);
795 PyTuple_SET_ITEM(t, 1, ob);
796 Py_INCREF(ob);
797
798 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
799 goto finally;
800
801 if (!self->bin) {
802 c_str[0] = PUT;
803 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
804 len = strlen(c_str);
805 }
806 else if (Pdata_Check(self->file)) {
807 if (write_other(self, NULL, 0) < 0) return -1;
808 PDATA_APPEND(self->file, memo_len, -1);
809 res=0; /* Job well done ;) */
810 goto finally;
811 }
812 else {
813 if (p >= 256) {
814 c_str[0] = LONG_BINPUT;
815 c_str[1] = (int)(p & 0xff);
816 c_str[2] = (int)((p >> 8) & 0xff);
817 c_str[3] = (int)((p >> 16) & 0xff);
818 c_str[4] = (int)((p >> 24) & 0xff);
819 len = 5;
820 }
821 else {
822 c_str[0] = BINPUT;
823 c_str[1] = p;
824 len = 2;
825 }
826 }
827
Tim Peters0bc93f52003-02-02 18:29:33 +0000828 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000829 goto finally;
830
831 res = 0;
832
833 finally:
834 Py_XDECREF(py_ob_id);
835 Py_XDECREF(memo_len);
836 Py_XDECREF(t);
837
838 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000839}
840
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000841static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000842whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000843{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000844 Py_ssize_t i, j;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000845 PyObject *module = 0, *modules_dict = 0,
846 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000847
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000848 module = PyObject_GetAttrString(global, "__module__");
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000849 if (module)
850 return module;
851 if (PyErr_ExceptionMatches(PyExc_AttributeError))
852 PyErr_Clear();
853 else
854 return NULL;
Guido van Rossum45188231997-09-28 05:38:51 +0000855
Tim Peterscba30e22003-02-01 06:24:36 +0000856 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000857 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000858
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000859 i = 0;
860 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000862 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000863
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000864 global_name_attr = PyObject_GetAttr(module, global_name);
865 if (!global_name_attr) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000866 if (PyErr_ExceptionMatches(PyExc_AttributeError))
867 PyErr_Clear();
868 else
869 return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000870 continue;
871 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000872
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000873 if (global_name_attr != global) {
874 Py_DECREF(global_name_attr);
875 continue;
876 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000877
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000878 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000879
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000880 break;
881 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000883 /* The following implements the rule in pickle.py added in 1.5
884 that used __main__ if no module is found. I don't actually
885 like this rule. jlf
886 */
887 if (!j) {
888 j=1;
889 name=__main___str;
890 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000891
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000892 Py_INCREF(name);
893 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000894}
895
896
Guido van Rossum60456fd1997-04-09 17:36:32 +0000897static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000898fast_save_enter(Picklerobject *self, PyObject *obj)
899{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000900 /* if fast_container < 0, we're doing an error exit. */
901 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
902 PyObject *key = NULL;
903 if (self->fast_memo == NULL) {
904 self->fast_memo = PyDict_New();
905 if (self->fast_memo == NULL) {
906 self->fast_container = -1;
907 return 0;
908 }
909 }
910 key = PyLong_FromVoidPtr(obj);
911 if (key == NULL)
912 return 0;
913 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000914 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000915 PyErr_Format(PyExc_ValueError,
Tim Peters92c8bb32003-02-13 23:00:26 +0000916 "fast mode: can't pickle cyclic objects "
917 "including object type %s at %p",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000918 obj->ob_type->tp_name, obj);
919 self->fast_container = -1;
920 return 0;
921 }
922 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000923 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000924 self->fast_container = -1;
925 return 0;
926 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000927 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000928 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000929 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000930}
931
Tim Peterscba30e22003-02-01 06:24:36 +0000932int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000933fast_save_leave(Picklerobject *self, PyObject *obj)
934{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000935 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
936 PyObject *key = PyLong_FromVoidPtr(obj);
937 if (key == NULL)
938 return 0;
939 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000940 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000941 return 0;
942 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000943 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000944 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000945 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000946}
947
948static int
Tim Peterscba30e22003-02-01 06:24:36 +0000949save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000950{
951 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000952 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000953 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000955 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000956}
957
Guido van Rossum77f6a652002-04-03 22:41:51 +0000958static int
Tim Peterscba30e22003-02-01 06:24:36 +0000959save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000960{
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000961 static const char *buf[2] = {FALSE, TRUE};
Guido van Rossume2763392002-04-05 19:30:08 +0000962 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossumddefaf32007-01-14 03:31:43 +0000963 long l = args == Py_True;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000964
Tim Peters3c67d792003-02-02 17:59:11 +0000965 if (self->proto >= 2) {
966 char opcode = l ? NEWTRUE : NEWFALSE;
967 if (self->write_func(self, &opcode, 1) < 0)
968 return -1;
969 }
970 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000971 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000972 return 0;
973}
Tim Peters84e87f32001-03-17 04:50:51 +0000974
Guido van Rossum60456fd1997-04-09 17:36:32 +0000975static int
Guido van Rossumddefaf32007-01-14 03:31:43 +0000976save_int(Picklerobject *self, long l)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000977{
978 char c_str[32];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000979 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000981 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000982#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000983 || l > 0x7fffffffL
984 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000985#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000986 ) {
987 /* Text-mode pickle, or long too big to fit in the 4-byte
988 * signed BININT format: store as a string.
989 */
990 c_str[0] = INT;
991 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +0000992 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000993 return -1;
994 }
995 else {
996 /* Binary pickle and l fits in a signed 4-byte int. */
997 c_str[1] = (int)( l & 0xff);
998 c_str[2] = (int)((l >> 8) & 0xff);
999 c_str[3] = (int)((l >> 16) & 0xff);
1000 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001001
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001002 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1003 if (c_str[2] == 0) {
1004 c_str[0] = BININT1;
1005 len = 2;
1006 }
1007 else {
1008 c_str[0] = BININT2;
1009 len = 3;
1010 }
1011 }
1012 else {
1013 c_str[0] = BININT;
1014 len = 5;
1015 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001016
Tim Peters0bc93f52003-02-02 18:29:33 +00001017 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001018 return -1;
1019 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001021 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001022}
1023
1024
1025static int
Tim Peterscba30e22003-02-01 06:24:36 +00001026save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001027{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001028 Py_ssize_t size;
Tim Petersee1a53c2003-02-02 02:57:53 +00001029 int res = -1;
1030 PyObject *repr = NULL;
Guido van Rossumddefaf32007-01-14 03:31:43 +00001031 int val = PyInt_AsLong(args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001032 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001033
Guido van Rossumddefaf32007-01-14 03:31:43 +00001034 if (val == -1 && PyErr_Occurred()) {
1035 /* out of range for int pickling */
1036 PyErr_Clear();
1037 }
1038 else
1039 return save_int(self, val);
1040
Tim Petersee1a53c2003-02-02 02:57:53 +00001041 if (self->proto >= 2) {
1042 /* Linear-time pickling. */
1043 size_t nbits;
1044 size_t nbytes;
1045 unsigned char *pdata;
1046 char c_str[5];
1047 int i;
1048 int sign = _PyLong_Sign(args);
1049
1050 if (sign == 0) {
1051 /* It's 0 -- an empty bytestring. */
1052 c_str[0] = LONG1;
1053 c_str[1] = 0;
1054 i = self->write_func(self, c_str, 2);
1055 if (i < 0) goto finally;
1056 res = 0;
1057 goto finally;
1058 }
1059 nbits = _PyLong_NumBits(args);
1060 if (nbits == (size_t)-1 && PyErr_Occurred())
1061 goto finally;
1062 /* How many bytes do we need? There are nbits >> 3 full
1063 * bytes of data, and nbits & 7 leftover bits. If there
1064 * are any leftover bits, then we clearly need another
1065 * byte. Wnat's not so obvious is that we *probably*
1066 * need another byte even if there aren't any leftovers:
1067 * the most-significant bit of the most-significant byte
1068 * acts like a sign bit, and it's usually got a sense
1069 * opposite of the one we need. The exception is longs
1070 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1071 * its own 256's-complement, so has the right sign bit
1072 * even without the extra byte. That's a pain to check
1073 * for in advance, though, so we always grab an extra
1074 * byte at the start, and cut it back later if possible.
1075 */
1076 nbytes = (nbits >> 3) + 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001077 if (nbytes > INT_MAX) {
Tim Petersee1a53c2003-02-02 02:57:53 +00001078 PyErr_SetString(PyExc_OverflowError, "long too large "
1079 "to pickle");
1080 goto finally;
1081 }
1082 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
1083 if (repr == NULL) goto finally;
1084 pdata = (unsigned char *)PyString_AS_STRING(repr);
1085 i = _PyLong_AsByteArray((PyLongObject *)args,
1086 pdata, nbytes,
1087 1 /* little endian */, 1 /* signed */);
1088 if (i < 0) goto finally;
1089 /* If the long is negative, this may be a byte more than
1090 * needed. This is so iff the MSB is all redundant sign
1091 * bits.
1092 */
1093 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1094 (pdata[nbytes - 2] & 0x80) != 0)
1095 --nbytes;
1096
1097 if (nbytes < 256) {
1098 c_str[0] = LONG1;
1099 c_str[1] = (char)nbytes;
1100 size = 2;
1101 }
1102 else {
1103 c_str[0] = LONG4;
1104 size = (int)nbytes;
1105 for (i = 1; i < 5; i++) {
1106 c_str[i] = (char)(size & 0xff);
1107 size >>= 8;
1108 }
1109 size = 5;
1110 }
1111 i = self->write_func(self, c_str, size);
1112 if (i < 0) goto finally;
1113 i = self->write_func(self, (char *)pdata, (int)nbytes);
1114 if (i < 0) goto finally;
1115 res = 0;
1116 goto finally;
1117 }
1118
1119 /* proto < 2: write the repr and newline. This is quadratic-time
1120 * (in the number of digits), in both directions.
1121 */
Tim Peterscba30e22003-02-01 06:24:36 +00001122 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001123 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001124
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001125 if ((size = PyString_Size(repr)) < 0)
1126 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001127
Tim Peters0bc93f52003-02-02 18:29:33 +00001128 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001129 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001130
Tim Peters0bc93f52003-02-02 18:29:33 +00001131 if (self->write_func(self,
1132 PyString_AS_STRING((PyStringObject *)repr),
1133 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001134 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001135
Tim Peters0bc93f52003-02-02 18:29:33 +00001136 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001137 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001139 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001140
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001141 finally:
1142 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001143 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001144}
1145
1146
1147static int
Tim Peterscba30e22003-02-01 06:24:36 +00001148save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001149{
1150 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001151
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001152 if (self->bin) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001153 char str[9];
Tim Peters9905b942003-03-20 20:53:32 +00001154 str[0] = BINFLOAT;
1155 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001156 return -1;
Tim Peters0bc93f52003-02-02 18:29:33 +00001157 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001158 return -1;
1159 }
1160 else {
1161 char c_str[250];
1162 c_str[0] = FLOAT;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001163 PyOS_ascii_formatd(c_str + 1, sizeof(c_str) - 2, "%.17g", x);
1164 /* Extend the formatted string with a newline character */
1165 strcat(c_str, "\n");
Guido van Rossum60456fd1997-04-09 17:36:32 +00001166
Tim Peters0bc93f52003-02-02 18:29:33 +00001167 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001168 return -1;
1169 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001170
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001171 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001172}
1173
1174
1175static int
Tim Peterscba30e22003-02-01 06:24:36 +00001176save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001177{
1178 int size, len;
1179 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001180
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001181 if ((size = PyString_Size(args)) < 0)
1182 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001184 if (!self->bin) {
1185 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001186
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001187 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001188
Tim Peterscba30e22003-02-01 06:24:36 +00001189 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001190 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001192 if ((len = PyString_Size(repr)) < 0)
1193 goto err;
1194 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001195
Tim Peters0bc93f52003-02-02 18:29:33 +00001196 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001197 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001198
Tim Peters0bc93f52003-02-02 18:29:33 +00001199 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001200 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001201
Tim Peters0bc93f52003-02-02 18:29:33 +00001202 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001203 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001205 Py_XDECREF(repr);
1206 }
1207 else {
1208 int i;
1209 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001211 if ((size = PyString_Size(args)) < 0)
1212 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001214 if (size < 256) {
1215 c_str[0] = SHORT_BINSTRING;
1216 c_str[1] = size;
1217 len = 2;
1218 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001219 else if (size <= INT_MAX) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001220 c_str[0] = BINSTRING;
1221 for (i = 1; i < 5; i++)
1222 c_str[i] = (int)(size >> ((i - 1) * 8));
1223 len = 5;
1224 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001225 else
1226 return -1; /* string too large */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001227
Tim Peters0bc93f52003-02-02 18:29:33 +00001228 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001229 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001230
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001231 if (size > 128 && Pdata_Check(self->file)) {
1232 if (write_other(self, NULL, 0) < 0) return -1;
1233 PDATA_APPEND(self->file, args, -1);
1234 }
1235 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001236 if (self->write_func(self,
1237 PyString_AS_STRING(
1238 (PyStringObject *)args),
1239 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001240 return -1;
1241 }
1242 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001243
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001244 if (doput)
1245 if (put(self, args) < 0)
1246 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001247
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001248 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001249
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001250 err:
1251 Py_XDECREF(repr);
1252 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001253}
1254
1255
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001256#ifdef Py_USING_UNICODE
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001257/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1258 backslash and newline characters to \uXXXX escapes. */
1259static PyObject *
1260modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1261{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001262 PyObject *repr;
1263 char *p;
1264 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001265
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001266 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001268 repr = PyString_FromStringAndSize(NULL, 6 * size);
1269 if (repr == NULL)
1270 return NULL;
1271 if (size == 0)
1272 return repr;
1273
1274 p = q = PyString_AS_STRING(repr);
1275 while (size-- > 0) {
1276 Py_UNICODE ch = *s++;
1277 /* Map 16-bit characters to '\uxxxx' */
1278 if (ch >= 256 || ch == '\\' || ch == '\n') {
1279 *p++ = '\\';
1280 *p++ = 'u';
1281 *p++ = hexdigit[(ch >> 12) & 0xf];
1282 *p++ = hexdigit[(ch >> 8) & 0xf];
1283 *p++ = hexdigit[(ch >> 4) & 0xf];
1284 *p++ = hexdigit[ch & 15];
1285 }
1286 /* Copy everything else as-is */
1287 else
1288 *p++ = (char) ch;
1289 }
1290 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001291 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001292 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001293}
1294
1295
Guido van Rossum60456fd1997-04-09 17:36:32 +00001296static int
Tim Peterscba30e22003-02-01 06:24:36 +00001297save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001298{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001299 Py_ssize_t size, len;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001300 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001301
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001302 if (!PyUnicode_Check(args))
1303 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001304
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001305 if (!self->bin) {
1306 char *repr_str;
1307 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001308
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001309 repr = modified_EncodeRawUnicodeEscape(
1310 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001311 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001312 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001313
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001314 if ((len = PyString_Size(repr)) < 0)
1315 goto err;
1316 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001317
Tim Peters0bc93f52003-02-02 18:29:33 +00001318 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001319 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001320
Tim Peters0bc93f52003-02-02 18:29:33 +00001321 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001322 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001323
Tim Peters0bc93f52003-02-02 18:29:33 +00001324 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001325 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001326
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001327 Py_XDECREF(repr);
1328 }
1329 else {
1330 int i;
1331 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001332
Tim Peterscba30e22003-02-01 06:24:36 +00001333 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001334 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001336 if ((size = PyString_Size(repr)) < 0)
1337 goto err;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001338 if (size > INT_MAX)
1339 return -1; /* string too large */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001340
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001341 c_str[0] = BINUNICODE;
1342 for (i = 1; i < 5; i++)
1343 c_str[i] = (int)(size >> ((i - 1) * 8));
1344 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001345
Tim Peters0bc93f52003-02-02 18:29:33 +00001346 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001347 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001348
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001349 if (size > 128 && Pdata_Check(self->file)) {
1350 if (write_other(self, NULL, 0) < 0)
1351 goto err;
1352 PDATA_APPEND(self->file, repr, -1);
1353 }
1354 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001355 if (self->write_func(self, PyString_AS_STRING(repr),
1356 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001357 goto err;
1358 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001359
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001360 Py_DECREF(repr);
1361 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001362
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001363 if (doput)
1364 if (put(self, args) < 0)
1365 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001366
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001367 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001369 err:
1370 Py_XDECREF(repr);
1371 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001372}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001373#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001374
Tim Peters1d63c9f2003-02-02 20:29:39 +00001375/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1376static int
Tim Peters67920142003-02-05 03:46:17 +00001377store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001378{
1379 int i;
1380 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001381
Tim Peters1d63c9f2003-02-02 20:29:39 +00001382 assert(PyTuple_Size(t) == len);
1383
1384 for (i = 0; i < len; i++) {
1385 PyObject *element = PyTuple_GET_ITEM(t, i);
1386
1387 if (element == NULL)
1388 goto finally;
1389 if (save(self, element, 0) < 0)
1390 goto finally;
1391 }
1392 res = 0;
1393
1394 finally:
1395 return res;
1396}
1397
1398/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1399 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001400 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001401 * (a tuple can be reached from itself), and that requires some subtle
1402 * magic so that it works in all cases. IOW, this is a long routine.
1403 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001404static int
Tim Peterscba30e22003-02-01 06:24:36 +00001405save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001406{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001407 PyObject *py_tuple_id = NULL;
1408 int len, i;
1409 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001410
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001411 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001412 static char pop = POP;
1413 static char pop_mark = POP_MARK;
1414 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001415
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001416 if ((len = PyTuple_Size(args)) < 0)
1417 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001418
Tim Peters1d63c9f2003-02-02 20:29:39 +00001419 if (len == 0) {
1420 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001421
Tim Peters1d63c9f2003-02-02 20:29:39 +00001422 if (self->proto) {
1423 c_str[0] = EMPTY_TUPLE;
1424 len = 1;
1425 }
1426 else {
1427 c_str[0] = MARK;
1428 c_str[1] = TUPLE;
1429 len = 2;
1430 }
1431 if (self->write_func(self, c_str, len) >= 0)
1432 res = 0;
1433 /* Don't memoize an empty tuple. */
1434 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001435 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001436
Tim Peters1d63c9f2003-02-02 20:29:39 +00001437 /* A non-empty tuple. */
1438
1439 /* id(tuple) isn't in the memo now. If it shows up there after
1440 * saving the tuple elements, the tuple must be recursive, in
1441 * which case we'll pop everything we put on the stack, and fetch
1442 * its value from the memo.
1443 */
1444 py_tuple_id = PyLong_FromVoidPtr(args);
1445 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001446 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001447
Tim Peters1d63c9f2003-02-02 20:29:39 +00001448 if (len <= 3 && self->proto >= 2) {
1449 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001450 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001451 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001452 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001453 /* pop the len elements */
1454 for (i = 0; i < len; ++i)
1455 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001456 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001457 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001458 if (get(self, py_tuple_id) < 0)
1459 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001460 res = 0;
1461 goto finally;
1462 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001463 /* Not recursive. */
1464 if (self->write_func(self, len2opcode + len, 1) < 0)
1465 goto finally;
1466 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001467 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001468
Tim Peters1d63c9f2003-02-02 20:29:39 +00001469 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1470 * Generate MARK elt1 elt2 ... TUPLE
1471 */
1472 if (self->write_func(self, &MARKv, 1) < 0)
1473 goto finally;
1474
Tim Peters67920142003-02-05 03:46:17 +00001475 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001476 goto finally;
1477
1478 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1479 /* pop the stack stuff we pushed */
1480 if (self->bin) {
1481 if (self->write_func(self, &pop_mark, 1) < 0)
1482 goto finally;
1483 }
1484 else {
1485 /* Note that we pop one more than len, to remove
1486 * the MARK too.
1487 */
1488 for (i = 0; i <= len; i++)
1489 if (self->write_func(self, &pop, 1) < 0)
1490 goto finally;
1491 }
1492 /* fetch from memo */
1493 if (get(self, py_tuple_id) >= 0)
1494 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001495 goto finally;
1496 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001497
Tim Peters1d63c9f2003-02-02 20:29:39 +00001498 /* Not recursive. */
1499 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001500 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001501
Tim Peters1d63c9f2003-02-02 20:29:39 +00001502 memoize:
1503 if (put(self, args) >= 0)
1504 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001506 finally:
1507 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001508 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001509}
1510
Tim Peters1092d642003-02-11 21:06:20 +00001511/* iter is an iterator giving items, and we batch up chunks of
1512 * MARK item item ... item APPENDS
1513 * opcode sequences. Calling code should have arranged to first create an
1514 * empty list, or list-like object, for the APPENDS to operate on.
1515 * Returns 0 on success, <0 on error.
1516 */
1517static int
1518batch_list(Picklerobject *self, PyObject *iter)
1519{
1520 PyObject *obj;
1521 PyObject *slice[BATCHSIZE];
1522 int i, n;
1523
1524 static char append = APPEND;
1525 static char appends = APPENDS;
1526
1527 assert(iter != NULL);
1528
1529 if (self->proto == 0) {
1530 /* APPENDS isn't available; do one at a time. */
1531 for (;;) {
1532 obj = PyIter_Next(iter);
1533 if (obj == NULL) {
1534 if (PyErr_Occurred())
1535 return -1;
1536 break;
1537 }
1538 i = save(self, obj, 0);
1539 Py_DECREF(obj);
1540 if (i < 0)
1541 return -1;
1542 if (self->write_func(self, &append, 1) < 0)
1543 return -1;
Tim Peters1092d642003-02-11 21:06:20 +00001544 }
1545 return 0;
1546 }
1547
1548 /* proto > 0: write in batches of BATCHSIZE. */
1549 do {
1550 /* Get next group of (no more than) BATCHSIZE elements. */
1551 for (n = 0; n < BATCHSIZE; ++n) {
1552 obj = PyIter_Next(iter);
1553 if (obj == NULL) {
1554 if (PyErr_Occurred())
1555 goto BatchFailed;
1556 break;
1557 }
1558 slice[n] = obj;
1559 }
1560
1561 if (n > 1) {
1562 /* Pump out MARK, slice[0:n], APPENDS. */
1563 if (self->write_func(self, &MARKv, 1) < 0)
1564 goto BatchFailed;
1565 for (i = 0; i < n; ++i) {
1566 if (save(self, slice[i], 0) < 0)
1567 goto BatchFailed;
1568 }
1569 if (self->write_func(self, &appends, 1) < 0)
1570 goto BatchFailed;
1571 }
1572 else if (n == 1) {
1573 if (save(self, slice[0], 0) < 0)
1574 goto BatchFailed;
1575 if (self->write_func(self, &append, 1) < 0)
1576 goto BatchFailed;
1577 }
1578
1579 for (i = 0; i < n; ++i) {
1580 Py_DECREF(slice[i]);
1581 }
Tim Peters90975f12003-02-12 05:28:58 +00001582 } while (n == BATCHSIZE);
Tim Peters1092d642003-02-11 21:06:20 +00001583 return 0;
1584
1585BatchFailed:
1586 while (--n >= 0) {
1587 Py_DECREF(slice[n]);
1588 }
1589 return -1;
1590}
1591
Guido van Rossum60456fd1997-04-09 17:36:32 +00001592static int
Tim Peterscba30e22003-02-01 06:24:36 +00001593save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001594{
Tim Peters1092d642003-02-11 21:06:20 +00001595 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001596 char s[3];
Tim Peters1092d642003-02-11 21:06:20 +00001597 int len;
1598 PyObject *iter;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001599
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001600 if (self->fast && !fast_save_enter(self, args))
1601 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001602
Tim Peters1092d642003-02-11 21:06:20 +00001603 /* Create an empty list. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001604 if (self->bin) {
1605 s[0] = EMPTY_LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001606 len = 1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001607 }
1608 else {
1609 s[0] = MARK;
1610 s[1] = LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001611 len = 2;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001612 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001613
Tim Peters1092d642003-02-11 21:06:20 +00001614 if (self->write_func(self, s, len) < 0)
1615 goto finally;
1616
1617 /* Get list length, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001618 if ((len = PyList_Size(args)) < 0)
1619 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001620
Tim Peters1092d642003-02-11 21:06:20 +00001621 /* Memoize. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001622 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001623 if (put(self, args) >= 0)
1624 res = 0;
1625 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001626 }
Tim Peters90975f12003-02-12 05:28:58 +00001627 if (put2(self, args) < 0)
1628 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001629
Tim Peters1092d642003-02-11 21:06:20 +00001630 /* Materialize the list elements. */
1631 iter = PyObject_GetIter(args);
1632 if (iter == NULL)
1633 goto finally;
1634 res = batch_list(self, iter);
1635 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001636
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001637 finally:
1638 if (self->fast && !fast_save_leave(self, args))
1639 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001640
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001641 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001642}
1643
1644
Tim Peters42f08ac2003-02-11 22:43:24 +00001645/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1646 * MARK key value ... key value SETITEMS
1647 * opcode sequences. Calling code should have arranged to first create an
1648 * empty dict, or dict-like object, for the SETITEMS to operate on.
1649 * Returns 0 on success, <0 on error.
1650 *
1651 * This is very much like batch_list(). The difference between saving
1652 * elements directly, and picking apart two-tuples, is so long-winded at
1653 * the C level, though, that attempts to combine these routines were too
1654 * ugly to bear.
1655 */
1656static int
1657batch_dict(Picklerobject *self, PyObject *iter)
1658{
1659 PyObject *p;
1660 PyObject *slice[BATCHSIZE];
1661 int i, n;
1662
1663 static char setitem = SETITEM;
1664 static char setitems = SETITEMS;
1665
1666 assert(iter != NULL);
1667
1668 if (self->proto == 0) {
1669 /* SETITEMS isn't available; do one at a time. */
1670 for (;;) {
1671 p = PyIter_Next(iter);
1672 if (p == NULL) {
1673 if (PyErr_Occurred())
1674 return -1;
1675 break;
1676 }
1677 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1678 PyErr_SetString(PyExc_TypeError, "dict items "
1679 "iterator must return 2-tuples");
1680 return -1;
1681 }
1682 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1683 if (i >= 0)
1684 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1685 Py_DECREF(p);
1686 if (i < 0)
1687 return -1;
1688 if (self->write_func(self, &setitem, 1) < 0)
1689 return -1;
Tim Peters42f08ac2003-02-11 22:43:24 +00001690 }
1691 return 0;
1692 }
1693
1694 /* proto > 0: write in batches of BATCHSIZE. */
1695 do {
1696 /* Get next group of (no more than) BATCHSIZE elements. */
1697 for (n = 0; n < BATCHSIZE; ++n) {
1698 p = PyIter_Next(iter);
1699 if (p == NULL) {
1700 if (PyErr_Occurred())
1701 goto BatchFailed;
1702 break;
1703 }
1704 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1705 PyErr_SetString(PyExc_TypeError, "dict items "
1706 "iterator must return 2-tuples");
1707 goto BatchFailed;
1708 }
1709 slice[n] = p;
1710 }
1711
1712 if (n > 1) {
1713 /* Pump out MARK, slice[0:n], SETITEMS. */
1714 if (self->write_func(self, &MARKv, 1) < 0)
1715 goto BatchFailed;
1716 for (i = 0; i < n; ++i) {
1717 p = slice[i];
1718 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1719 goto BatchFailed;
1720 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1721 goto BatchFailed;
1722 }
1723 if (self->write_func(self, &setitems, 1) < 0)
1724 goto BatchFailed;
1725 }
1726 else if (n == 1) {
1727 p = slice[0];
1728 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1729 goto BatchFailed;
1730 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1731 goto BatchFailed;
1732 if (self->write_func(self, &setitem, 1) < 0)
1733 goto BatchFailed;
1734 }
1735
1736 for (i = 0; i < n; ++i) {
1737 Py_DECREF(slice[i]);
1738 }
Tim Peters90975f12003-02-12 05:28:58 +00001739 } while (n == BATCHSIZE);
Tim Peters42f08ac2003-02-11 22:43:24 +00001740 return 0;
1741
1742BatchFailed:
1743 while (--n >= 0) {
1744 Py_DECREF(slice[n]);
1745 }
1746 return -1;
1747}
1748
Guido van Rossum60456fd1997-04-09 17:36:32 +00001749static int
Tim Peterscba30e22003-02-01 06:24:36 +00001750save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001751{
Tim Peters42f08ac2003-02-11 22:43:24 +00001752 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001753 char s[3];
Tim Peters42f08ac2003-02-11 22:43:24 +00001754 int len;
1755 PyObject *iter;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001756
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001757 if (self->fast && !fast_save_enter(self, args))
1758 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001759
Tim Peters42f08ac2003-02-11 22:43:24 +00001760 /* Create an empty dict. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001761 if (self->bin) {
1762 s[0] = EMPTY_DICT;
1763 len = 1;
1764 }
1765 else {
1766 s[0] = MARK;
1767 s[1] = DICT;
1768 len = 2;
1769 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001770
Tim Peters0bc93f52003-02-02 18:29:33 +00001771 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001772 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001773
Tim Peters42f08ac2003-02-11 22:43:24 +00001774 /* Get dict size, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001775 if ((len = PyDict_Size(args)) < 0)
1776 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001778 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001779 if (put(self, args) >= 0)
1780 res = 0;
1781 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001782 }
Tim Peters90975f12003-02-12 05:28:58 +00001783 if (put2(self, args) < 0)
1784 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001785
Tim Peters42f08ac2003-02-11 22:43:24 +00001786 /* Materialize the dict items. */
1787 iter = PyObject_CallMethod(args, "iteritems", "()");
1788 if (iter == NULL)
1789 goto finally;
1790 res = batch_dict(self, iter);
1791 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001793 finally:
1794 if (self->fast && !fast_save_leave(self, args))
1795 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001796
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001797 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001798}
1799
1800
Guido van Rossum60456fd1997-04-09 17:36:32 +00001801static int
Tim Peterscba30e22003-02-01 06:24:36 +00001802save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001803{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001804 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001805 char *name_str, *module_str;
1806 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001808 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001809
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001810 if (name) {
1811 global_name = name;
1812 Py_INCREF(global_name);
1813 }
1814 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001815 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001816 goto finally;
1817 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001818
Tim Peterscba30e22003-02-01 06:24:36 +00001819 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001820 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001821
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001822 if ((module_size = PyString_Size(module)) < 0 ||
1823 (name_size = PyString_Size(global_name)) < 0)
1824 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001825
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001826 module_str = PyString_AS_STRING((PyStringObject *)module);
1827 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001828
Guido van Rossum75bfd052002-12-24 18:10:07 +00001829 /* XXX This can be doing a relative import. Clearly it shouldn't,
1830 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001831 mod = PyImport_ImportModule(module_str);
1832 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001833 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001834 "Can't pickle %s: import of module %s "
1835 "failed",
1836 "OS", args, module);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001837 goto finally;
1838 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001839 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001840 if (klass == NULL) {
1841 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001842 "Can't pickle %s: attribute lookup %s.%s "
1843 "failed",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001844 "OSS", args, module, global_name);
1845 goto finally;
1846 }
1847 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001848 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001849 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00001850 "Can't pickle %s: it's not the same object "
1851 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001852 "OSS", args, module, global_name);
1853 goto finally;
1854 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001855 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001856
Tim Peters731098b2003-02-04 20:56:09 +00001857 if (self->proto >= 2) {
1858 /* See whether this is in the extension registry, and if
1859 * so generate an EXT opcode.
1860 */
1861 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00001862 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00001863 char c_str[5];
1864 int n;
1865
1866 PyTuple_SET_ITEM(two_tuple, 0, module);
1867 PyTuple_SET_ITEM(two_tuple, 1, global_name);
1868 py_code = PyDict_GetItem(extension_registry, two_tuple);
1869 if (py_code == NULL)
1870 goto gen_global; /* not registered */
1871
1872 /* Verify py_code has the right type and value. */
1873 if (!PyInt_Check(py_code)) {
1874 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00001875 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00001876 "OO", args, py_code);
1877 goto finally;
1878 }
1879 code = PyInt_AS_LONG(py_code);
1880 if (code <= 0 || code > 0x7fffffffL) {
1881 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
1882 "extension code %ld is out of range",
1883 "Ol", args, code);
1884 goto finally;
1885 }
1886
1887 /* Generate an EXT opcode. */
1888 if (code <= 0xff) {
1889 c_str[0] = EXT1;
1890 c_str[1] = (char)code;
1891 n = 2;
1892 }
1893 else if (code <= 0xffff) {
1894 c_str[0] = EXT2;
1895 c_str[1] = (char)(code & 0xff);
1896 c_str[2] = (char)((code >> 8) & 0xff);
1897 n = 3;
1898 }
1899 else {
1900 c_str[0] = EXT4;
1901 c_str[1] = (char)(code & 0xff);
1902 c_str[2] = (char)((code >> 8) & 0xff);
1903 c_str[3] = (char)((code >> 16) & 0xff);
1904 c_str[4] = (char)((code >> 24) & 0xff);
1905 n = 5;
1906 }
1907
1908 if (self->write_func(self, c_str, n) >= 0)
1909 res = 0;
1910 goto finally; /* and don't memoize */
1911 }
1912
1913 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00001914 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001915 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001916
Tim Peters0bc93f52003-02-02 18:29:33 +00001917 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001918 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001919
Tim Peters0bc93f52003-02-02 18:29:33 +00001920 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001921 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001922
Tim Peters0bc93f52003-02-02 18:29:33 +00001923 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001924 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001925
Tim Peters0bc93f52003-02-02 18:29:33 +00001926 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001927 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001928
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001929 if (put(self, args) < 0)
1930 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001931
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001932 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001933
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001934 finally:
1935 Py_XDECREF(module);
1936 Py_XDECREF(global_name);
1937 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001939 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001940}
1941
Guido van Rossum60456fd1997-04-09 17:36:32 +00001942static int
Tim Peterscba30e22003-02-01 06:24:36 +00001943save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001944{
1945 PyObject *pid = 0;
1946 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001947
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001948 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001949
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001950 Py_INCREF(args);
1951 ARG_TUP(self, args);
1952 if (self->arg) {
1953 pid = PyObject_Call(f, self->arg, NULL);
1954 FREE_ARG_TUP(self);
1955 }
1956 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001958 if (pid != Py_None) {
1959 if (!self->bin) {
1960 if (!PyString_Check(pid)) {
1961 PyErr_SetString(PicklingError,
1962 "persistent id must be string");
1963 goto finally;
1964 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001965
Tim Peters0bc93f52003-02-02 18:29:33 +00001966 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001967 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001968
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001969 if ((size = PyString_Size(pid)) < 0)
1970 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001971
Tim Peters0bc93f52003-02-02 18:29:33 +00001972 if (self->write_func(self,
1973 PyString_AS_STRING(
1974 (PyStringObject *)pid),
1975 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001976 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001977
Tim Peters0bc93f52003-02-02 18:29:33 +00001978 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001979 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001980
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001981 res = 1;
1982 goto finally;
1983 }
1984 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001985 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001986 res = -1;
1987 else
1988 res = 1;
1989 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001990
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001991 goto finally;
1992 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001993
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001994 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001995
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001996 finally:
1997 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001998
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001999 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002000}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002001
Tim Peters71fcda52003-02-14 23:05:28 +00002002/* We're saving ob, and args is the 2-thru-5 tuple returned by the
2003 * appropriate __reduce__ method for ob.
2004 */
Tim Peters84e87f32001-03-17 04:50:51 +00002005static int
Tim Peters71fcda52003-02-14 23:05:28 +00002006save_reduce(Picklerobject *self, PyObject *args, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002007{
Tim Peters71fcda52003-02-14 23:05:28 +00002008 PyObject *callable;
2009 PyObject *argtup;
2010 PyObject *state = NULL;
2011 PyObject *listitems = NULL;
2012 PyObject *dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002013
Tim Peters71fcda52003-02-14 23:05:28 +00002014 int use_newobj = self->proto >= 2;
2015
2016 static char reduce = REDUCE;
2017 static char build = BUILD;
2018 static char newobj = NEWOBJ;
2019
2020 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
2021 &callable,
2022 &argtup,
2023 &state,
2024 &listitems,
2025 &dictitems))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002026 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002027
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002028 if (!PyTuple_Check(argtup)) {
2029 PyErr_SetString(PicklingError,
2030 "args from reduce() should be a tuple");
2031 return -1;
2032 }
2033
Tim Peters71fcda52003-02-14 23:05:28 +00002034 if (state == Py_None)
2035 state = NULL;
2036 if (listitems == Py_None)
2037 listitems = NULL;
2038 if (dictitems == Py_None)
2039 dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002040
Tim Peters71fcda52003-02-14 23:05:28 +00002041 /* Protocol 2 special case: if callable's name is __newobj__, use
2042 * NEWOBJ. This consumes a lot of code.
2043 */
2044 if (use_newobj) {
2045 PyObject *temp = PyObject_GetAttr(callable, __name___str);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002046
Tim Peters71fcda52003-02-14 23:05:28 +00002047 if (temp == NULL) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002048 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2049 PyErr_Clear();
2050 else
2051 return -1;
Tim Peters71fcda52003-02-14 23:05:28 +00002052 use_newobj = 0;
2053 }
2054 else {
2055 use_newobj = PyString_Check(temp) &&
2056 strcmp(PyString_AS_STRING(temp),
2057 "__newobj__") == 0;
2058 Py_DECREF(temp);
2059 }
2060 }
2061 if (use_newobj) {
2062 PyObject *cls;
2063 PyObject *newargtup;
2064 int n, i;
2065
2066 /* Sanity checks. */
2067 n = PyTuple_Size(argtup);
2068 if (n < 1) {
2069 PyErr_SetString(PicklingError, "__newobj__ arglist "
2070 "is empty");
2071 return -1;
2072 }
2073
2074 cls = PyTuple_GET_ITEM(argtup, 0);
2075 if (! PyObject_HasAttrString(cls, "__new__")) {
2076 PyErr_SetString(PicklingError, "args[0] from "
2077 "__newobj__ args has no __new__");
2078 return -1;
2079 }
2080
2081 /* XXX How could ob be NULL? */
2082 if (ob != NULL) {
2083 PyObject *ob_dot_class;
2084
2085 ob_dot_class = PyObject_GetAttr(ob, __class___str);
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002086 if (ob_dot_class == NULL) {
2087 if (PyErr_ExceptionMatches(
2088 PyExc_AttributeError))
2089 PyErr_Clear();
2090 else
2091 return -1;
2092 }
Tim Peters71fcda52003-02-14 23:05:28 +00002093 i = ob_dot_class != cls; /* true iff a problem */
2094 Py_XDECREF(ob_dot_class);
2095 if (i) {
2096 PyErr_SetString(PicklingError, "args[0] from "
2097 "__newobj__ args has the wrong class");
2098 return -1;
2099 }
2100 }
2101
2102 /* Save the class and its __new__ arguments. */
2103 if (save(self, cls, 0) < 0)
2104 return -1;
2105
2106 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2107 if (newargtup == NULL)
2108 return -1;
2109 for (i = 1; i < n; ++i) {
2110 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2111 Py_INCREF(temp);
2112 PyTuple_SET_ITEM(newargtup, i-1, temp);
2113 }
2114 i = save(self, newargtup, 0) < 0;
2115 Py_DECREF(newargtup);
2116 if (i < 0)
2117 return -1;
2118
2119 /* Add NEWOBJ opcode. */
2120 if (self->write_func(self, &newobj, 1) < 0)
2121 return -1;
2122 }
2123 else {
2124 /* Not using NEWOBJ. */
2125 if (save(self, callable, 0) < 0 ||
2126 save(self, argtup, 0) < 0 ||
2127 self->write_func(self, &reduce, 1) < 0)
2128 return -1;
2129 }
2130
2131 /* Memoize. */
2132 /* XXX How can ob be NULL? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002133 if (ob != NULL) {
2134 if (state && !PyDict_Check(state)) {
2135 if (put2(self, ob) < 0)
2136 return -1;
2137 }
Tim Peters71fcda52003-02-14 23:05:28 +00002138 else if (put(self, ob) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002139 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002140 }
Tim Peters84e87f32001-03-17 04:50:51 +00002141
Guido van Rossum60456fd1997-04-09 17:36:32 +00002142
Tim Peters71fcda52003-02-14 23:05:28 +00002143 if (listitems && batch_list(self, listitems) < 0)
2144 return -1;
2145
2146 if (dictitems && batch_dict(self, dictitems) < 0)
2147 return -1;
2148
2149 if (state) {
2150 if (save(self, state, 0) < 0 ||
2151 self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002152 return -1;
2153 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002155 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002156}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002157
Guido van Rossum60456fd1997-04-09 17:36:32 +00002158static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002159save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002160{
2161 PyTypeObject *type;
Tim Peters71fcda52003-02-14 23:05:28 +00002162 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
2163 PyObject *arg_tup;
2164 int res = -1;
2165 int tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002166
Martin v. Löwis5a395302002-08-04 08:20:23 +00002167 if (self->nesting++ > Py_GetRecursionLimit()){
2168 PyErr_SetString(PyExc_RuntimeError,
2169 "maximum recursion depth exceeded");
2170 goto finally;
2171 }
2172
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002173 if (!pers_save && self->pers_func) {
2174 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2175 res = tmp;
2176 goto finally;
2177 }
2178 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002179
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002180 if (args == Py_None) {
2181 res = save_none(self, args);
2182 goto finally;
2183 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002185 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002186
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002187 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002188 case 'b':
2189 if (args == Py_False || args == Py_True) {
2190 res = save_bool(self, args);
2191 goto finally;
2192 }
2193 break;
Guido van Rossum52d01782007-01-14 04:02:16 +00002194 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002195 if (type == &PyLong_Type) {
2196 res = save_long(self, args);
2197 goto finally;
2198 }
2199 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002200
Guido van Rossum60456fd1997-04-09 17:36:32 +00002201 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002202 if (type == &PyFloat_Type) {
2203 res = save_float(self, args);
2204 goto finally;
2205 }
2206 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002207
Guido van Rossum60456fd1997-04-09 17:36:32 +00002208 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002209 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2210 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002211 goto finally;
2212 }
2213 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002214
Guido van Rossum60456fd1997-04-09 17:36:32 +00002215 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002216 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2217 res = save_string(self, args, 0);
2218 goto finally;
2219 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002220
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002221#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002222 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002223 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2224 res = save_unicode(self, args, 0);
2225 goto finally;
2226 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002227#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002228 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002229
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002230 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002231 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002232 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002234 if (PyDict_GetItem(self->memo, py_ob_id)) {
2235 if (get(self, py_ob_id) < 0)
2236 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002237
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002238 res = 0;
2239 goto finally;
2240 }
2241 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002242
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002243 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002244 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002245 if (type == &PyString_Type) {
2246 res = save_string(self, args, 1);
2247 goto finally;
2248 }
2249 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002250
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002251#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002252 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002253 if (type == &PyUnicode_Type) {
2254 res = save_unicode(self, args, 1);
2255 goto finally;
2256 }
2257 break;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002258#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002259
Guido van Rossum60456fd1997-04-09 17:36:32 +00002260 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002261 if (type == &PyTuple_Type) {
2262 res = save_tuple(self, args);
2263 goto finally;
2264 }
2265 if (type == &PyType_Type) {
2266 res = save_global(self, args, NULL);
2267 goto finally;
2268 }
2269 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002270
Guido van Rossum60456fd1997-04-09 17:36:32 +00002271 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002272 if (type == &PyList_Type) {
2273 res = save_list(self, args);
2274 goto finally;
2275 }
2276 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002277
2278 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002279 if (type == &PyDict_Type) {
2280 res = save_dict(self, args);
2281 goto finally;
2282 }
2283 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002284
Guido van Rossum512ab9f2006-08-17 22:28:49 +00002285 case 'i':
2286 break;
2287
2288 case 'c':
2289 break;
2290
Guido van Rossum60456fd1997-04-09 17:36:32 +00002291 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002292 if (type == &PyFunction_Type) {
2293 res = save_global(self, args, NULL);
Christian Tismer2460c622004-02-26 16:21:45 +00002294 if (res && PyErr_ExceptionMatches(PickleError)) {
2295 /* fall back to reduce */
2296 PyErr_Clear();
2297 break;
2298 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002299 goto finally;
2300 }
2301 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002302
2303 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002304 if (type == &PyCFunction_Type) {
2305 res = save_global(self, args, NULL);
2306 goto finally;
2307 }
2308 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002309
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002310 if (!pers_save && self->inst_pers_func) {
2311 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2312 res = tmp;
2313 goto finally;
2314 }
2315 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002316
Jeremy Hylton39c61162002-07-16 19:47:43 +00002317 if (PyType_IsSubtype(type, &PyType_Type)) {
2318 res = save_global(self, args, NULL);
2319 goto finally;
2320 }
2321
Guido van Rossumb289b872003-02-19 01:45:13 +00002322 /* Get a reduction callable, and call it. This may come from
2323 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
2324 * or the object's __reduce__ method.
Tim Peters71fcda52003-02-14 23:05:28 +00002325 */
Tim Peters5aa3da62003-02-13 21:03:57 +00002326 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2327 if (__reduce__ != NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002328 Py_INCREF(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00002329 Py_INCREF(args);
2330 ARG_TUP(self, args);
2331 if (self->arg) {
2332 t = PyObject_Call(__reduce__, self->arg, NULL);
2333 FREE_ARG_TUP(self);
2334 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002335 }
2336 else {
Guido van Rossumb289b872003-02-19 01:45:13 +00002337 /* Check for a __reduce_ex__ method. */
2338 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2339 if (__reduce__ != NULL) {
2340 t = PyInt_FromLong(self->proto);
2341 if (t != NULL) {
2342 ARG_TUP(self, t);
2343 t = NULL;
2344 if (self->arg) {
2345 t = PyObject_Call(__reduce__,
2346 self->arg, NULL);
2347 FREE_ARG_TUP(self);
2348 }
2349 }
2350 }
2351 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002352 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2353 PyErr_Clear();
2354 else
2355 goto finally;
Guido van Rossumb289b872003-02-19 01:45:13 +00002356 /* Check for a __reduce__ method. */
2357 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2358 if (__reduce__ != NULL) {
2359 t = PyObject_Call(__reduce__,
2360 empty_tuple, NULL);
2361 }
2362 else {
2363 PyErr_SetObject(UnpickleableError, args);
2364 goto finally;
2365 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002366 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002367 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002368
Tim Peters71fcda52003-02-14 23:05:28 +00002369 if (t == NULL)
2370 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002371
Tim Peters71fcda52003-02-14 23:05:28 +00002372 if (PyString_Check(t)) {
2373 res = save_global(self, args, t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002374 goto finally;
2375 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002376
Tim Peters71fcda52003-02-14 23:05:28 +00002377 if (! PyTuple_Check(t)) {
2378 cPickle_ErrFormat(PicklingError, "Value returned by "
2379 "%s must be string or tuple",
2380 "O", __reduce__);
2381 goto finally;
2382 }
2383
2384 size = PyTuple_Size(t);
2385 if (size < 2 || size > 5) {
2386 cPickle_ErrFormat(PicklingError, "tuple returned by "
2387 "%s must contain 2 through 5 elements",
2388 "O", __reduce__);
2389 goto finally;
2390 }
2391
2392 arg_tup = PyTuple_GET_ITEM(t, 1);
2393 if (!(PyTuple_Check(arg_tup) || arg_tup == Py_None)) {
2394 cPickle_ErrFormat(PicklingError, "Second element of "
2395 "tuple returned by %s must be a tuple",
2396 "O", __reduce__);
2397 goto finally;
2398 }
2399
2400 res = save_reduce(self, t, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002401
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002402 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002403 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002404 Py_XDECREF(py_ob_id);
2405 Py_XDECREF(__reduce__);
2406 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002407
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002408 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002409}
2410
2411
2412static int
Tim Peterscba30e22003-02-01 06:24:36 +00002413dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002414{
2415 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002416
Tim Peters4190fb82003-02-02 16:09:05 +00002417 if (self->proto >= 2) {
2418 char bytes[2];
2419
2420 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002421 assert(self->proto >= 0 && self->proto < 256);
2422 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002423 if (self->write_func(self, bytes, 2) < 0)
2424 return -1;
2425 }
2426
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002427 if (save(self, args, 0) < 0)
2428 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002429
Tim Peters4190fb82003-02-02 16:09:05 +00002430 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002431 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002432
Tim Peters4190fb82003-02-02 16:09:05 +00002433 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002434 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002435
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002436 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002437}
2438
2439static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002440Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002441{
Tim Peterscba30e22003-02-01 06:24:36 +00002442 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002443 PyDict_Clear(self->memo);
2444 Py_INCREF(Py_None);
2445 return Py_None;
2446}
2447
2448static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002449Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002450{
2451 int l, i, rsize, ssize, clear=1, lm;
2452 long ik;
2453 PyObject *k, *r;
2454 char *s, *p, *have_get;
2455 Pdata *data;
2456
2457 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002458 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002459 return NULL;
2460
2461 /* Check to make sure we are based on a list */
2462 if (! Pdata_Check(self->file)) {
2463 PyErr_SetString(PicklingError,
2464 "Attempt to getvalue() a non-list-based pickler");
2465 return NULL;
2466 }
2467
2468 /* flush write buffer */
2469 if (write_other(self, NULL, 0) < 0) return NULL;
2470
2471 data=(Pdata*)self->file;
2472 l=data->length;
2473
2474 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002475 lm = PyDict_Size(self->memo);
2476 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002477 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002478 have_get = malloc(lm);
2479 if (have_get == NULL) return PyErr_NoMemory();
2480 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002481
2482 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002483 for (rsize = 0, i = l; --i >= 0; ) {
2484 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002485
Tim Petersac5687a2003-02-02 18:08:34 +00002486 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002487 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002488
2489 else if (PyInt_Check(k)) { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002490 ik = PyInt_AsLong(k);
2491 if (ik == -1 && PyErr_Occurred())
2492 goto err;
Tim Petersac5687a2003-02-02 18:08:34 +00002493 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002494 PyErr_SetString(PicklingError,
2495 "Invalid get data");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002496 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002497 }
Tim Petersac5687a2003-02-02 18:08:34 +00002498 if (have_get[ik]) /* with matching get */
2499 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002500 }
2501
2502 else if (! (PyTuple_Check(k) &&
2503 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002504 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002505 ) {
2506 PyErr_SetString(PicklingError,
2507 "Unexpected data in internal list");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002508 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002509 }
2510
2511 else { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002512 ik = PyInt_AsLong(k);
2513 if (ik == -1 && PyErr_Occurred())
2514 goto err;
Tim Petersac5687a2003-02-02 18:08:34 +00002515 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002516 PyErr_SetString(PicklingError,
2517 "Invalid get data");
2518 return NULL;
2519 }
Tim Petersac5687a2003-02-02 18:08:34 +00002520 have_get[ik] = 1;
2521 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002522 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002523 }
2524
2525 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002526 r = PyString_FromStringAndSize(NULL, rsize);
2527 if (r == NULL) goto err;
2528 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002529
Tim Petersac5687a2003-02-02 18:08:34 +00002530 for (i = 0; i < l; i++) {
2531 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002532
2533 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002534 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002535 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002536 p=PyString_AS_STRING((PyStringObject *)k);
2537 while (--ssize >= 0)
2538 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002539 }
2540 }
2541
2542 else if (PyTuple_Check(k)) { /* get */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002543 ik = PyLong_AsLong(PyTuple_GET_ITEM(k, 0));
2544 if (ik == -1 && PyErr_Occurred())
2545 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002546 if (ik < 256) {
2547 *s++ = BINGET;
2548 *s++ = (int)(ik & 0xff);
2549 }
2550 else {
2551 *s++ = LONG_BINGET;
2552 *s++ = (int)(ik & 0xff);
2553 *s++ = (int)((ik >> 8) & 0xff);
2554 *s++ = (int)((ik >> 16) & 0xff);
2555 *s++ = (int)((ik >> 24) & 0xff);
2556 }
2557 }
2558
2559 else { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002560 ik = PyLong_AsLong(k);
2561 if (ik == -1 && PyErr_Occurred())
2562 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002563
2564 if (have_get[ik]) { /* with matching get */
2565 if (ik < 256) {
2566 *s++ = BINPUT;
2567 *s++ = (int)(ik & 0xff);
2568 }
2569 else {
2570 *s++ = LONG_BINPUT;
2571 *s++ = (int)(ik & 0xff);
2572 *s++ = (int)((ik >> 8) & 0xff);
2573 *s++ = (int)((ik >> 16) & 0xff);
2574 *s++ = (int)((ik >> 24) & 0xff);
2575 }
2576 }
2577 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002578 }
2579
2580 if (clear) {
2581 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002582 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002583 }
2584
2585 free(have_get);
2586 return r;
2587 err:
2588 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002589 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002590}
2591
2592static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002593Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002594{
2595 PyObject *ob;
2596 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002597
Tim Peterscba30e22003-02-01 06:24:36 +00002598 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002599 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002600
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002601 if (dump(self, ob) < 0)
2602 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002603
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002604 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002605
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002606 /* XXX Why does dump() return self? */
2607 Py_INCREF(self);
2608 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002609}
2610
2611
Tim Peterscba30e22003-02-01 06:24:36 +00002612static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002613{
Neal Norwitzb0493252002-03-31 14:44:22 +00002614 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002615 PyDoc_STR("dump(object) -- "
2616 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002617 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002618 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002619 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002620 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002621 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002622};
2623
2624
2625static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002626newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002627{
2628 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002629
Tim Peters5bd2a792003-02-01 16:45:06 +00002630 if (proto < 0)
Tim Peters8587b3c2003-02-13 15:44:41 +00002631 proto = HIGHEST_PROTOCOL;
2632 if (proto > HIGHEST_PROTOCOL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002633 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2634 "the highest available protocol is %d",
Tim Peters8587b3c2003-02-13 15:44:41 +00002635 proto, HIGHEST_PROTOCOL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002636 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002637 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002638
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002639 self = PyObject_GC_New(Picklerobject, &Picklertype);
Tim Peters5bd2a792003-02-01 16:45:06 +00002640 if (self == NULL)
2641 return NULL;
2642 self->proto = proto;
2643 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002644 self->fp = NULL;
2645 self->write = NULL;
2646 self->memo = NULL;
2647 self->arg = NULL;
2648 self->pers_func = NULL;
2649 self->inst_pers_func = NULL;
2650 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002651 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002652 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002653 self->fast_container = 0;
2654 self->fast_memo = NULL;
2655 self->buf_size = 0;
2656 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002657
Tim Peters5bd2a792003-02-01 16:45:06 +00002658 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002659 if (file)
2660 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002661 else {
2662 file = Pdata_New();
2663 if (file == NULL)
2664 goto err;
2665 }
2666 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002667
Tim Peterscba30e22003-02-01 06:24:36 +00002668 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002669 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002671 if (PyFile_Check(file)) {
2672 self->fp = PyFile_AsFile(file);
2673 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002674 PyErr_SetString(PyExc_ValueError,
2675 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002676 goto err;
2677 }
2678 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002679 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002680 else if (PycStringIO_OutputCheck(file)) {
2681 self->write_func = write_cStringIO;
2682 }
2683 else if (file == Py_None) {
2684 self->write_func = write_none;
2685 }
2686 else {
2687 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002688
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002689 if (! Pdata_Check(file)) {
2690 self->write = PyObject_GetAttr(file, write_str);
2691 if (!self->write) {
2692 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002693 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002694 "argument must have 'write' "
2695 "attribute");
2696 goto err;
2697 }
2698 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002699
Tim Peters5bd2a792003-02-01 16:45:06 +00002700 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2701 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002702 PyErr_NoMemory();
2703 goto err;
2704 }
2705 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002706
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002707 if (PyEval_GetRestricted()) {
2708 /* Restricted execution, get private tables */
Tim Peters5b7da392003-02-04 00:21:07 +00002709 PyObject *m = PyImport_Import(copy_reg_str);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002710
Tim Peters5b7da392003-02-04 00:21:07 +00002711 if (m == NULL)
2712 goto err;
2713 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002714 Py_DECREF(m);
Tim Peters5b7da392003-02-04 00:21:07 +00002715 if (self->dispatch_table == NULL)
2716 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002717 }
2718 else {
Tim Peters5b7da392003-02-04 00:21:07 +00002719 self->dispatch_table = dispatch_table;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002720 Py_INCREF(dispatch_table);
2721 }
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002722 PyObject_GC_Track(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002723
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002724 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002725
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002726 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002727 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002728 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002729}
2730
2731
2732static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00002733get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002734{
Martin v. Löwis15e62742006-02-27 16:46:16 +00002735 static char *kwlist[] = {"file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002736 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002737 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002738
Tim Peters92c8bb32003-02-13 23:00:26 +00002739 /* XXX
Martin v. Löwis544f1192004-07-27 05:22:33 +00002740 * The documented signature is Pickler(file, protocol=0), but this
Tim Peters92c8bb32003-02-13 23:00:26 +00002741 * accepts Pickler() and Pickler(integer) too. The meaning then
2742 * is clear as mud, undocumented, and not supported by pickle.py.
2743 * I'm told Zope uses this, but I haven't traced into this code
2744 * far enough to figure out what it means.
Tim Peters5bd2a792003-02-01 16:45:06 +00002745 */
2746 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002747 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002748 proto = 0;
Martin v. Löwis544f1192004-07-27 05:22:33 +00002749 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
2750 kwlist, &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002751 return NULL;
2752 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002753 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002754}
2755
2756
2757static void
Tim Peterscba30e22003-02-01 06:24:36 +00002758Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002759{
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002760 PyObject_GC_UnTrack(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002761 Py_XDECREF(self->write);
2762 Py_XDECREF(self->memo);
2763 Py_XDECREF(self->fast_memo);
2764 Py_XDECREF(self->arg);
2765 Py_XDECREF(self->file);
2766 Py_XDECREF(self->pers_func);
2767 Py_XDECREF(self->inst_pers_func);
2768 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002769 PyMem_Free(self->write_buf);
Tim Peters3cfe7542003-05-21 21:29:48 +00002770 self->ob_type->tp_free((PyObject *)self);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002771}
2772
2773static int
2774Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
2775{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002776 Py_VISIT(self->write);
2777 Py_VISIT(self->memo);
2778 Py_VISIT(self->fast_memo);
2779 Py_VISIT(self->arg);
2780 Py_VISIT(self->file);
2781 Py_VISIT(self->pers_func);
2782 Py_VISIT(self->inst_pers_func);
2783 Py_VISIT(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002784 return 0;
2785}
2786
2787static int
2788Pickler_clear(Picklerobject *self)
2789{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002790 Py_CLEAR(self->write);
2791 Py_CLEAR(self->memo);
2792 Py_CLEAR(self->fast_memo);
2793 Py_CLEAR(self->arg);
2794 Py_CLEAR(self->file);
2795 Py_CLEAR(self->pers_func);
2796 Py_CLEAR(self->inst_pers_func);
2797 Py_CLEAR(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002798 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002799}
2800
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002801static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002802Pickler_get_pers_func(Picklerobject *p)
2803{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002804 if (p->pers_func == NULL)
2805 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2806 else
2807 Py_INCREF(p->pers_func);
2808 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002809}
2810
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002811static int
2812Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2813{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002814 if (v == NULL) {
2815 PyErr_SetString(PyExc_TypeError,
2816 "attribute deletion is not supported");
2817 return -1;
2818 }
2819 Py_XDECREF(p->pers_func);
2820 Py_INCREF(v);
2821 p->pers_func = v;
2822 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002823}
2824
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002825static int
2826Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2827{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002828 if (v == NULL) {
2829 PyErr_SetString(PyExc_TypeError,
2830 "attribute deletion is not supported");
2831 return -1;
2832 }
2833 Py_XDECREF(p->inst_pers_func);
2834 Py_INCREF(v);
2835 p->inst_pers_func = v;
2836 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002837}
2838
2839static PyObject *
2840Pickler_get_memo(Picklerobject *p)
2841{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002842 if (p->memo == NULL)
2843 PyErr_SetString(PyExc_AttributeError, "memo");
2844 else
2845 Py_INCREF(p->memo);
2846 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002847}
2848
2849static int
2850Pickler_set_memo(Picklerobject *p, PyObject *v)
2851{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002852 if (v == NULL) {
2853 PyErr_SetString(PyExc_TypeError,
2854 "attribute deletion is not supported");
2855 return -1;
2856 }
2857 if (!PyDict_Check(v)) {
2858 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2859 return -1;
2860 }
2861 Py_XDECREF(p->memo);
2862 Py_INCREF(v);
2863 p->memo = v;
2864 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002865}
2866
2867static PyObject *
2868Pickler_get_error(Picklerobject *p)
2869{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002870 /* why is this an attribute on the Pickler? */
2871 Py_INCREF(PicklingError);
2872 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002873}
2874
2875static PyMemberDef Pickler_members[] = {
2876 {"binary", T_INT, offsetof(Picklerobject, bin)},
2877 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002878 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002879};
2880
2881static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002882 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002883 (setter)Pickler_set_pers_func},
2884 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2885 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002886 {"PicklingError", (getter)Pickler_get_error, NULL},
2887 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002888};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002889
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002890PyDoc_STRVAR(Picklertype__doc__,
2891"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002892
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002893static PyTypeObject Picklertype = {
2894 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002895 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002896 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002897 sizeof(Picklerobject), /*tp_basicsize*/
2898 0,
2899 (destructor)Pickler_dealloc, /* tp_dealloc */
2900 0, /* tp_print */
2901 0, /* tp_getattr */
2902 0, /* tp_setattr */
2903 0, /* tp_compare */
2904 0, /* tp_repr */
2905 0, /* tp_as_number */
2906 0, /* tp_as_sequence */
2907 0, /* tp_as_mapping */
2908 0, /* tp_hash */
2909 0, /* tp_call */
2910 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002911 PyObject_GenericGetAttr, /* tp_getattro */
2912 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002913 0, /* tp_as_buffer */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002914 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002915 Picklertype__doc__, /* tp_doc */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002916 (traverseproc)Pickler_traverse, /* tp_traverse */
2917 (inquiry)Pickler_clear, /* tp_clear */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002918 0, /* tp_richcompare */
2919 0, /* tp_weaklistoffset */
2920 0, /* tp_iter */
2921 0, /* tp_iternext */
2922 Pickler_methods, /* tp_methods */
2923 Pickler_members, /* tp_members */
2924 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002925};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002926
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002927static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002928find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002929{
2930 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002931
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002932 if (fc) {
2933 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00002934 PyErr_SetString(UnpicklingError, "Global and instance "
2935 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002936 return NULL;
2937 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002938 return PyObject_CallFunctionObjArgs(fc, py_module_name,
2939 py_global_name, NULL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002940 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002942 module = PySys_GetObject("modules");
2943 if (module == NULL)
2944 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002946 module = PyDict_GetItem(module, py_module_name);
2947 if (module == NULL) {
2948 module = PyImport_Import(py_module_name);
2949 if (!module)
2950 return NULL;
2951 global = PyObject_GetAttr(module, py_global_name);
2952 Py_DECREF(module);
2953 }
2954 else
2955 global = PyObject_GetAttr(module, py_global_name);
2956 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002957}
2958
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002959static int
Tim Peterscba30e22003-02-01 06:24:36 +00002960marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002961{
2962 if (self->num_marks < 1) {
2963 PyErr_SetString(UnpicklingError, "could not find MARK");
2964 return -1;
2965 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002966
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002967 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002968}
2969
Tim Peters84e87f32001-03-17 04:50:51 +00002970
Guido van Rossum60456fd1997-04-09 17:36:32 +00002971static int
Tim Peterscba30e22003-02-01 06:24:36 +00002972load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002973{
2974 PDATA_APPEND(self->stack, Py_None, -1);
2975 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002976}
2977
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002978static int
Tim Peterscba30e22003-02-01 06:24:36 +00002979bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002980{
2981 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2982 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002983}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002984
2985static int
Tim Peterscba30e22003-02-01 06:24:36 +00002986load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002987{
2988 PyObject *py_int = 0;
2989 char *endptr, *s;
2990 int len, res = -1;
2991 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002992
Tim Peters0bc93f52003-02-02 18:29:33 +00002993 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002994 if (len < 2) return bad_readline();
2995 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002996
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002997 errno = 0;
2998 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002999
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003000 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
3001 /* Hm, maybe we've got something long. Let's try reading
3002 it as a Python long object. */
3003 errno = 0;
3004 py_int = PyLong_FromString(s, NULL, 0);
3005 if (py_int == NULL) {
3006 PyErr_SetString(PyExc_ValueError,
3007 "could not convert string to int");
3008 goto finally;
3009 }
3010 }
3011 else {
Guido van Rossume2763392002-04-05 19:30:08 +00003012 if (len == 3 && (l == 0 || l == 1)) {
3013 if (!( py_int = PyBool_FromLong(l))) goto finally;
3014 }
3015 else {
3016 if (!( py_int = PyInt_FromLong(l))) goto finally;
3017 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003018 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003019
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003020 free(s);
3021 PDATA_PUSH(self->stack, py_int, -1);
3022 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003024 finally:
3025 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003026
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003027 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003028}
3029
Tim Peters3c67d792003-02-02 17:59:11 +00003030static int
3031load_bool(Unpicklerobject *self, PyObject *boolean)
3032{
3033 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00003034 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00003035 return 0;
3036}
3037
Tim Petersee1a53c2003-02-02 02:57:53 +00003038/* s contains x bytes of a little-endian integer. Return its value as a
3039 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3040 * int, but when x is 4 it's a signed one. This is an historical source
3041 * of x-platform bugs.
3042 */
Tim Peters84e87f32001-03-17 04:50:51 +00003043static long
Tim Petersee1a53c2003-02-02 02:57:53 +00003044calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003045{
3046 unsigned char c;
3047 int i;
3048 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003049
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003050 for (i = 0, l = 0L; i < x; i++) {
3051 c = (unsigned char)s[i];
3052 l |= (long)c << (i * 8);
3053 }
Tim Petersbfa18f72001-04-10 01:54:42 +00003054#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003055 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3056 * is signed, so on a box with longs bigger than 4 bytes we need
3057 * to extend a BININT's sign bit to the full width.
3058 */
3059 if (x == 4 && l & (1L << 31))
3060 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00003061#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003062 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003063}
3064
3065
3066static int
Tim Peterscba30e22003-02-01 06:24:36 +00003067load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003068{
3069 PyObject *py_int = 0;
3070 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003071
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003072 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003073
Tim Peterscba30e22003-02-01 06:24:36 +00003074 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003075 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003076
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003077 PDATA_PUSH(self->stack, py_int, -1);
3078 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003079}
3080
3081
3082static int
Tim Peterscba30e22003-02-01 06:24:36 +00003083load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003084{
3085 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003086
Tim Peters0bc93f52003-02-02 18:29:33 +00003087 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003088 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003089
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003090 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003091}
3092
3093
3094static int
Tim Peterscba30e22003-02-01 06:24:36 +00003095load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003096{
3097 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003098
Tim Peters0bc93f52003-02-02 18:29:33 +00003099 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003100 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003101
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003102 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003103}
3104
3105
3106static int
Tim Peterscba30e22003-02-01 06:24:36 +00003107load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003108{
3109 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003110
Tim Peters0bc93f52003-02-02 18:29:33 +00003111 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003112 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003113
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003114 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003115}
Tim Peters84e87f32001-03-17 04:50:51 +00003116
Guido van Rossum60456fd1997-04-09 17:36:32 +00003117static int
Tim Peterscba30e22003-02-01 06:24:36 +00003118load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003119{
3120 PyObject *l = 0;
3121 char *end, *s;
3122 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003123
Tim Peters0bc93f52003-02-02 18:29:33 +00003124 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003125 if (len < 2) return bad_readline();
3126 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003127
Tim Peterscba30e22003-02-01 06:24:36 +00003128 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003129 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003130
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003131 free(s);
3132 PDATA_PUSH(self->stack, l, -1);
3133 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003134
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003135 finally:
3136 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003138 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003139}
3140
Tim Petersee1a53c2003-02-02 02:57:53 +00003141/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3142 * data following.
3143 */
3144static int
3145load_counted_long(Unpicklerobject *self, int size)
3146{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003147 Py_ssize_t i;
Tim Petersee1a53c2003-02-02 02:57:53 +00003148 char *nbytes;
3149 unsigned char *pdata;
3150 PyObject *along;
3151
3152 assert(size == 1 || size == 4);
3153 i = self->read_func(self, &nbytes, size);
3154 if (i < 0) return -1;
3155
3156 size = calc_binint(nbytes, size);
3157 if (size < 0) {
3158 /* Corrupt or hostile pickle -- we never write one like
3159 * this.
3160 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003161 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003162 "byte count");
3163 return -1;
3164 }
3165
3166 if (size == 0)
3167 along = PyLong_FromLong(0L);
3168 else {
3169 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003170 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003171 if (i < 0) return -1;
3172 along = _PyLong_FromByteArray(pdata, (size_t)size,
3173 1 /* little endian */, 1 /* signed */);
3174 }
3175 if (along == NULL)
3176 return -1;
3177 PDATA_PUSH(self->stack, along, -1);
3178 return 0;
3179}
Tim Peters84e87f32001-03-17 04:50:51 +00003180
Guido van Rossum60456fd1997-04-09 17:36:32 +00003181static int
Tim Peterscba30e22003-02-01 06:24:36 +00003182load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003183{
3184 PyObject *py_float = 0;
3185 char *endptr, *s;
3186 int len, res = -1;
3187 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003188
Tim Peters0bc93f52003-02-02 18:29:33 +00003189 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003190 if (len < 2) return bad_readline();
3191 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003193 errno = 0;
Martin v. Löwis737ea822004-06-08 18:52:54 +00003194 d = PyOS_ascii_strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003195
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003196 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3197 PyErr_SetString(PyExc_ValueError,
3198 "could not convert string to float");
3199 goto finally;
3200 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003201
Tim Peterscba30e22003-02-01 06:24:36 +00003202 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003203 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003204
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003205 free(s);
3206 PDATA_PUSH(self->stack, py_float, -1);
3207 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003208
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003209 finally:
3210 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003212 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003213}
3214
Guido van Rossum60456fd1997-04-09 17:36:32 +00003215static int
Tim Peterscba30e22003-02-01 06:24:36 +00003216load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003217{
Tim Peters9905b942003-03-20 20:53:32 +00003218 PyObject *py_float;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003219 double x;
3220 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003221
Tim Peters0bc93f52003-02-02 18:29:33 +00003222 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003223 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003224
Tim Peters9905b942003-03-20 20:53:32 +00003225 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3226 if (x == -1.0 && PyErr_Occurred())
3227 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003228
Tim Peters9905b942003-03-20 20:53:32 +00003229 py_float = PyFloat_FromDouble(x);
3230 if (py_float == NULL)
3231 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003232
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003233 PDATA_PUSH(self->stack, py_float, -1);
3234 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003235}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003236
3237static int
Tim Peterscba30e22003-02-01 06:24:36 +00003238load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003239{
3240 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003241 int len, res = -1;
3242 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003243
Tim Peters0bc93f52003-02-02 18:29:33 +00003244 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003245 if (len < 2) return bad_readline();
3246 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003247
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003248
3249 /* Strip outermost quotes */
3250 while (s[len-1] <= ' ')
3251 len--;
3252 if(s[0]=='"' && s[len-1]=='"'){
3253 s[len-1] = '\0';
3254 p = s + 1 ;
3255 len -= 2;
3256 } else if(s[0]=='\'' && s[len-1]=='\''){
3257 s[len-1] = '\0';
3258 p = s + 1 ;
3259 len -= 2;
3260 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003261 goto insecure;
3262 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003263
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003264 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003265 free(s);
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003266 if (str) {
3267 PDATA_PUSH(self->stack, str, -1);
3268 res = 0;
3269 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003270 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003272 insecure:
3273 free(s);
3274 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3275 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003276}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003277
3278
3279static int
Tim Peterscba30e22003-02-01 06:24:36 +00003280load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003281{
3282 PyObject *py_string = 0;
3283 long l;
3284 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003285
Tim Peters0bc93f52003-02-02 18:29:33 +00003286 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003287
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003288 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003289
Tim Peters0bc93f52003-02-02 18:29:33 +00003290 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003291 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003292
Tim Peterscba30e22003-02-01 06:24:36 +00003293 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003294 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003295
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003296 PDATA_PUSH(self->stack, py_string, -1);
3297 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003298}
3299
3300
3301static int
Tim Peterscba30e22003-02-01 06:24:36 +00003302load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003303{
3304 PyObject *py_string = 0;
3305 unsigned char l;
3306 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003307
Tim Peters0bc93f52003-02-02 18:29:33 +00003308 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003309 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003311 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003312
Tim Peters0bc93f52003-02-02 18:29:33 +00003313 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003314
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003315 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003316
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003317 PDATA_PUSH(self->stack, py_string, -1);
3318 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003319}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003320
3321
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003322#ifdef Py_USING_UNICODE
Guido van Rossum60456fd1997-04-09 17:36:32 +00003323static int
Tim Peterscba30e22003-02-01 06:24:36 +00003324load_unicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003325{
3326 PyObject *str = 0;
3327 int len, res = -1;
3328 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003329
Tim Peters0bc93f52003-02-02 18:29:33 +00003330 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003331 if (len < 1) return bad_readline();
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003332
Tim Peterscba30e22003-02-01 06:24:36 +00003333 if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003334 goto finally;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003336 PDATA_PUSH(self->stack, str, -1);
3337 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003338
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003339 finally:
3340 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003341}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003342#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003343
3344
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003345#ifdef Py_USING_UNICODE
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003346static int
Tim Peterscba30e22003-02-01 06:24:36 +00003347load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003348{
3349 PyObject *unicode;
3350 long l;
3351 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003352
Tim Peters0bc93f52003-02-02 18:29:33 +00003353 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003354
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003355 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003356
Tim Peters0bc93f52003-02-02 18:29:33 +00003357 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003358 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003359
Tim Peterscba30e22003-02-01 06:24:36 +00003360 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003361 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003362
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003363 PDATA_PUSH(self->stack, unicode, -1);
3364 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003365}
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003366#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003367
3368
3369static int
Tim Peterscba30e22003-02-01 06:24:36 +00003370load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003371{
3372 PyObject *tup;
3373 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003374
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003375 if ((i = marker(self)) < 0) return -1;
3376 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3377 PDATA_PUSH(self->stack, tup, -1);
3378 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003379}
3380
3381static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003382load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003383{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003384 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003385
Tim Peters1d63c9f2003-02-02 20:29:39 +00003386 if (tup == NULL)
3387 return -1;
3388
3389 while (--len >= 0) {
3390 PyObject *element;
3391
3392 PDATA_POP(self->stack, element);
3393 if (element == NULL)
3394 return -1;
3395 PyTuple_SET_ITEM(tup, len, element);
3396 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003397 PDATA_PUSH(self->stack, tup, -1);
3398 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003399}
3400
3401static int
Tim Peterscba30e22003-02-01 06:24:36 +00003402load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003403{
3404 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003405
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003406 if (!( list=PyList_New(0))) return -1;
3407 PDATA_PUSH(self->stack, list, -1);
3408 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003409}
3410
3411static int
Tim Peterscba30e22003-02-01 06:24:36 +00003412load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003413{
3414 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003415
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003416 if (!( dict=PyDict_New())) return -1;
3417 PDATA_PUSH(self->stack, dict, -1);
3418 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003419}
3420
3421
3422static int
Tim Peterscba30e22003-02-01 06:24:36 +00003423load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003424{
3425 PyObject *list = 0;
3426 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003427
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003428 if ((i = marker(self)) < 0) return -1;
3429 if (!( list=Pdata_popList(self->stack, i))) return -1;
3430 PDATA_PUSH(self->stack, list, -1);
3431 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003432}
3433
3434static int
Tim Peterscba30e22003-02-01 06:24:36 +00003435load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003436{
3437 PyObject *dict, *key, *value;
3438 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003440 if ((i = marker(self)) < 0) return -1;
3441 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003443 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003445 for (k = i+1; k < j; k += 2) {
3446 key =self->stack->data[k-1];
3447 value=self->stack->data[k ];
3448 if (PyDict_SetItem(dict, key, value) < 0) {
3449 Py_DECREF(dict);
3450 return -1;
3451 }
3452 }
3453 Pdata_clear(self->stack, i);
3454 PDATA_PUSH(self->stack, dict, -1);
3455 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003456}
3457
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003458static PyObject *
3459Instance_New(PyObject *cls, PyObject *args)
3460{
3461 PyObject *r = 0;
3462
3463 if ((r=PyObject_CallObject(cls, args))) return r;
3464
3465 {
3466 PyObject *tp, *v, *tb, *tmp_value;
3467
3468 PyErr_Fetch(&tp, &v, &tb);
3469 tmp_value = v;
3470 /* NULL occurs when there was a KeyboardInterrupt */
3471 if (tmp_value == NULL)
3472 tmp_value = Py_None;
3473 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {
3474 Py_XDECREF(v);
3475 v=r;
3476 }
3477 PyErr_Restore(tp,v,tb);
3478 }
3479 return NULL;
3480}
3481
Guido van Rossum60456fd1997-04-09 17:36:32 +00003482
3483static int
Tim Peterscba30e22003-02-01 06:24:36 +00003484load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003485{
3486 PyObject *class, *tup, *obj=0;
3487 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003489 if ((i = marker(self)) < 0) return -1;
3490 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3491 PDATA_POP(self->stack, class);
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003492 if (class) {
3493 obj = Instance_New(class, tup);
3494 Py_DECREF(class);
3495 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003496 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003497
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003498 if (! obj) return -1;
3499 PDATA_PUSH(self->stack, obj, -1);
3500 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003501}
3502
3503
3504static int
Tim Peterscba30e22003-02-01 06:24:36 +00003505load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003506{
3507 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3508 int i, len;
3509 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003510
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003511 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003512
Tim Peters0bc93f52003-02-02 18:29:33 +00003513 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003514 if (len < 2) return bad_readline();
3515 module_name = PyString_FromStringAndSize(s, len - 1);
3516 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003517
Tim Peters0bc93f52003-02-02 18:29:33 +00003518 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003519 if (len < 2) return bad_readline();
3520 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003521 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003522 self->find_class);
3523 Py_DECREF(class_name);
3524 }
3525 }
3526 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003527
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003528 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003529
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003530 if ((tup=Pdata_popTuple(self->stack, i))) {
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003531 obj = Instance_New(class, tup);
3532 Py_DECREF(tup);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003533 }
3534 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003536 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003537
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003538 PDATA_PUSH(self->stack, obj, -1);
3539 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003540}
3541
Tim Peterseab7db32003-02-13 18:24:14 +00003542static int
3543load_newobj(Unpicklerobject *self)
3544{
3545 PyObject *args = NULL;
3546 PyObject *clsraw = NULL;
3547 PyTypeObject *cls; /* clsraw cast to its true type */
3548 PyObject *obj;
3549
3550 /* Stack is ... cls argtuple, and we want to call
3551 * cls.__new__(cls, *argtuple).
3552 */
3553 PDATA_POP(self->stack, args);
3554 if (args == NULL) goto Fail;
3555 if (! PyTuple_Check(args)) {
3556 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3557 "tuple.");
3558 goto Fail;
3559 }
3560
3561 PDATA_POP(self->stack, clsraw);
3562 cls = (PyTypeObject *)clsraw;
3563 if (cls == NULL) goto Fail;
3564 if (! PyType_Check(cls)) {
3565 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3566 "isn't a type object");
3567 goto Fail;
3568 }
3569 if (cls->tp_new == NULL) {
3570 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3571 "has NULL tp_new");
3572 goto Fail;
3573 }
3574
3575 /* Call __new__. */
3576 obj = cls->tp_new(cls, args, NULL);
3577 if (obj == NULL) goto Fail;
3578
3579 Py_DECREF(args);
3580 Py_DECREF(clsraw);
3581 PDATA_PUSH(self->stack, obj, -1);
3582 return 0;
3583
3584 Fail:
3585 Py_XDECREF(args);
3586 Py_XDECREF(clsraw);
3587 return -1;
3588}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003589
3590static int
Tim Peterscba30e22003-02-01 06:24:36 +00003591load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003592{
3593 PyObject *class = 0, *module_name = 0, *class_name = 0;
3594 int len;
3595 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003596
Tim Peters0bc93f52003-02-02 18:29:33 +00003597 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003598 if (len < 2) return bad_readline();
3599 module_name = PyString_FromStringAndSize(s, len - 1);
3600 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003601
Tim Peters0bc93f52003-02-02 18:29:33 +00003602 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003603 if (len < 2) {
3604 Py_DECREF(module_name);
3605 return bad_readline();
3606 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003607 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003608 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003609 self->find_class);
3610 Py_DECREF(class_name);
3611 }
3612 }
3613 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003614
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003615 if (! class) return -1;
3616 PDATA_PUSH(self->stack, class, -1);
3617 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003618}
3619
3620
3621static int
Tim Peterscba30e22003-02-01 06:24:36 +00003622load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003623{
3624 PyObject *pid = 0;
3625 int len;
3626 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003627
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003628 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003629 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003630 if (len < 2) return bad_readline();
3631
3632 pid = PyString_FromStringAndSize(s, len - 1);
3633 if (!pid) return -1;
3634
3635 if (PyList_Check(self->pers_func)) {
3636 if (PyList_Append(self->pers_func, pid) < 0) {
3637 Py_DECREF(pid);
3638 return -1;
3639 }
3640 }
3641 else {
3642 ARG_TUP(self, pid);
3643 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003644 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003645 NULL);
3646 FREE_ARG_TUP(self);
3647 }
3648 }
3649
3650 if (! pid) return -1;
3651
3652 PDATA_PUSH(self->stack, pid, -1);
3653 return 0;
3654 }
3655 else {
3656 PyErr_SetString(UnpicklingError,
3657 "A load persistent id instruction was encountered,\n"
3658 "but no persistent_load function was specified.");
3659 return -1;
3660 }
3661}
3662
3663static int
Tim Peterscba30e22003-02-01 06:24:36 +00003664load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003665{
3666 PyObject *pid = 0;
3667
3668 if (self->pers_func) {
3669 PDATA_POP(self->stack, pid);
3670 if (! pid) return -1;
3671
3672 if (PyList_Check(self->pers_func)) {
3673 if (PyList_Append(self->pers_func, pid) < 0) {
3674 Py_DECREF(pid);
3675 return -1;
3676 }
3677 }
3678 else {
3679 ARG_TUP(self, pid);
3680 if (self->arg) {
3681 pid = PyObject_Call(self->pers_func, self->arg,
3682 NULL);
3683 FREE_ARG_TUP(self);
3684 }
3685 if (! pid) return -1;
3686 }
3687
3688 PDATA_PUSH(self->stack, pid, -1);
3689 return 0;
3690 }
3691 else {
3692 PyErr_SetString(UnpicklingError,
3693 "A load persistent id instruction was encountered,\n"
3694 "but no persistent_load function was specified.");
3695 return -1;
3696 }
3697}
3698
3699
3700static int
Tim Peterscba30e22003-02-01 06:24:36 +00003701load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003702{
3703 int len;
3704
3705 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3706
3707 /* Note that we split the (pickle.py) stack into two stacks,
3708 an object stack and a mark stack. We have to be clever and
3709 pop the right one. We do this by looking at the top of the
3710 mark stack.
3711 */
3712
3713 if ((self->num_marks > 0) &&
3714 (self->marks[self->num_marks - 1] == len))
3715 self->num_marks--;
3716 else {
3717 len--;
3718 Py_DECREF(self->stack->data[len]);
3719 self->stack->length=len;
3720 }
3721
3722 return 0;
3723}
3724
3725
3726static int
Tim Peterscba30e22003-02-01 06:24:36 +00003727load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003728{
3729 int i;
3730
3731 if ((i = marker(self)) < 0)
3732 return -1;
3733
3734 Pdata_clear(self->stack, i);
3735
3736 return 0;
3737}
3738
3739
3740static int
Tim Peterscba30e22003-02-01 06:24:36 +00003741load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003742{
3743 PyObject *last;
3744 int len;
3745
3746 if ((len = self->stack->length) <= 0) return stackUnderflow();
3747 last=self->stack->data[len-1];
3748 Py_INCREF(last);
3749 PDATA_PUSH(self->stack, last, -1);
3750 return 0;
3751}
3752
3753
3754static int
Tim Peterscba30e22003-02-01 06:24:36 +00003755load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003756{
3757 PyObject *py_str = 0, *value = 0;
3758 int len;
3759 char *s;
3760 int rc;
3761
Tim Peters0bc93f52003-02-02 18:29:33 +00003762 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003763 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003764
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003765 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003766
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003767 value = PyDict_GetItem(self->memo, py_str);
3768 if (! value) {
3769 PyErr_SetObject(BadPickleGet, py_str);
3770 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003771 }
3772 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003773 PDATA_APPEND(self->stack, value, -1);
3774 rc = 0;
3775 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003776
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003777 Py_DECREF(py_str);
3778 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003779}
3780
3781
3782static int
Tim Peterscba30e22003-02-01 06:24:36 +00003783load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003784{
3785 PyObject *py_key = 0, *value = 0;
3786 unsigned char key;
3787 char *s;
3788 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003789
Tim Peters0bc93f52003-02-02 18:29:33 +00003790 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003792 key = (unsigned char)s[0];
3793 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003794
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003795 value = PyDict_GetItem(self->memo, py_key);
3796 if (! value) {
3797 PyErr_SetObject(BadPickleGet, py_key);
3798 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003799 }
3800 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003801 PDATA_APPEND(self->stack, value, -1);
3802 rc = 0;
3803 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003804
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003805 Py_DECREF(py_key);
3806 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003807}
3808
3809
3810static int
Tim Peterscba30e22003-02-01 06:24:36 +00003811load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003812{
3813 PyObject *py_key = 0, *value = 0;
3814 unsigned char c;
3815 char *s;
3816 long key;
3817 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003818
Tim Peters0bc93f52003-02-02 18:29:33 +00003819 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003820
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003821 c = (unsigned char)s[0];
3822 key = (long)c;
3823 c = (unsigned char)s[1];
3824 key |= (long)c << 8;
3825 c = (unsigned char)s[2];
3826 key |= (long)c << 16;
3827 c = (unsigned char)s[3];
3828 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003829
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003830 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3831
3832 value = PyDict_GetItem(self->memo, py_key);
3833 if (! value) {
3834 PyErr_SetObject(BadPickleGet, py_key);
3835 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003836 }
3837 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003838 PDATA_APPEND(self->stack, value, -1);
3839 rc = 0;
3840 }
3841
3842 Py_DECREF(py_key);
3843 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003844}
3845
Tim Peters2d629652003-02-04 05:06:17 +00003846/* Push an object from the extension registry (EXT[124]). nbytes is
3847 * the number of bytes following the opcode, holding the index (code) value.
3848 */
3849static int
3850load_extension(Unpicklerobject *self, int nbytes)
3851{
3852 char *codebytes; /* the nbytes bytes after the opcode */
3853 long code; /* calc_binint returns long */
3854 PyObject *py_code; /* code as a Python int */
3855 PyObject *obj; /* the object to push */
3856 PyObject *pair; /* (module_name, class_name) */
3857 PyObject *module_name, *class_name;
3858
3859 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
3860 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
3861 code = calc_binint(codebytes, nbytes);
3862 if (code <= 0) { /* note that 0 is forbidden */
3863 /* Corrupt or hostile pickle. */
3864 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
3865 return -1;
3866 }
3867
3868 /* Look for the code in the cache. */
3869 py_code = PyInt_FromLong(code);
3870 if (py_code == NULL) return -1;
3871 obj = PyDict_GetItem(extension_cache, py_code);
3872 if (obj != NULL) {
3873 /* Bingo. */
3874 Py_DECREF(py_code);
3875 PDATA_APPEND(self->stack, obj, -1);
3876 return 0;
3877 }
3878
3879 /* Look up the (module_name, class_name) pair. */
3880 pair = PyDict_GetItem(inverted_registry, py_code);
3881 if (pair == NULL) {
3882 Py_DECREF(py_code);
3883 PyErr_Format(PyExc_ValueError, "unregistered extension "
3884 "code %ld", code);
3885 return -1;
3886 }
3887 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00003888 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00003889 */
3890 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
3891 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
3892 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
3893 Py_DECREF(py_code);
3894 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
3895 "isn't a 2-tuple of strings", code);
3896 return -1;
3897 }
3898 /* Load the object. */
3899 obj = find_class(module_name, class_name, self->find_class);
3900 if (obj == NULL) {
3901 Py_DECREF(py_code);
3902 return -1;
3903 }
3904 /* Cache code -> obj. */
3905 code = PyDict_SetItem(extension_cache, py_code, obj);
3906 Py_DECREF(py_code);
3907 if (code < 0) {
3908 Py_DECREF(obj);
3909 return -1;
3910 }
3911 PDATA_PUSH(self->stack, obj, -1);
3912 return 0;
3913}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003914
3915static int
Tim Peterscba30e22003-02-01 06:24:36 +00003916load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003917{
3918 PyObject *py_str = 0, *value = 0;
3919 int len, l;
3920 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003921
Tim Peters0bc93f52003-02-02 18:29:33 +00003922 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003923 if (l < 2) return bad_readline();
3924 if (!( len=self->stack->length )) return stackUnderflow();
3925 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3926 value=self->stack->data[len-1];
3927 l=PyDict_SetItem(self->memo, py_str, value);
3928 Py_DECREF(py_str);
3929 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003930}
3931
3932
3933static int
Tim Peterscba30e22003-02-01 06:24:36 +00003934load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003935{
3936 PyObject *py_key = 0, *value = 0;
3937 unsigned char key;
3938 char *s;
3939 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003940
Tim Peters0bc93f52003-02-02 18:29:33 +00003941 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003942 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003944 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003945
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003946 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3947 value=self->stack->data[len-1];
3948 len=PyDict_SetItem(self->memo, py_key, value);
3949 Py_DECREF(py_key);
3950 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003951}
3952
3953
3954static int
Tim Peterscba30e22003-02-01 06:24:36 +00003955load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003956{
3957 PyObject *py_key = 0, *value = 0;
3958 long key;
3959 unsigned char c;
3960 char *s;
3961 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003962
Tim Peters0bc93f52003-02-02 18:29:33 +00003963 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003964 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003965
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003966 c = (unsigned char)s[0];
3967 key = (long)c;
3968 c = (unsigned char)s[1];
3969 key |= (long)c << 8;
3970 c = (unsigned char)s[2];
3971 key |= (long)c << 16;
3972 c = (unsigned char)s[3];
3973 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003974
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003975 if (!( py_key = PyInt_FromLong(key))) return -1;
3976 value=self->stack->data[len-1];
3977 len=PyDict_SetItem(self->memo, py_key, value);
3978 Py_DECREF(py_key);
3979 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003980}
3981
3982
3983static int
Tim Peterscba30e22003-02-01 06:24:36 +00003984do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003985{
3986 PyObject *value = 0, *list = 0, *append_method = 0;
3987 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003988
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003989 len=self->stack->length;
3990 if (!( len >= x && x > 0 )) return stackUnderflow();
3991 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003992 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003993
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003994 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003995
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003996 if (PyList_Check(list)) {
3997 PyObject *slice;
3998 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003999
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004000 slice=Pdata_popList(self->stack, x);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004001 if (! slice) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004002 list_len = PyList_GET_SIZE(list);
4003 i=PyList_SetSlice(list, list_len, list_len, slice);
4004 Py_DECREF(slice);
4005 return i;
4006 }
4007 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004008
Tim Peterscba30e22003-02-01 06:24:36 +00004009 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004010 return -1;
4011
4012 for (i = x; i < len; i++) {
4013 PyObject *junk;
4014
4015 value=self->stack->data[i];
4016 junk=0;
4017 ARG_TUP(self, value);
4018 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004019 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004020 NULL);
4021 FREE_ARG_TUP(self);
4022 }
4023 if (! junk) {
4024 Pdata_clear(self->stack, i+1);
4025 self->stack->length=x;
4026 Py_DECREF(append_method);
4027 return -1;
4028 }
4029 Py_DECREF(junk);
4030 }
4031 self->stack->length=x;
4032 Py_DECREF(append_method);
4033 }
4034
4035 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004036}
4037
4038
4039static int
Tim Peterscba30e22003-02-01 06:24:36 +00004040load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004041{
4042 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004043}
4044
4045
4046static int
Tim Peterscba30e22003-02-01 06:24:36 +00004047load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004048{
4049 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004050}
4051
4052
4053static int
Tim Peterscba30e22003-02-01 06:24:36 +00004054do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004055{
4056 PyObject *value = 0, *key = 0, *dict = 0;
4057 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004059 if (!( (len=self->stack->length) >= x
4060 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004061
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004062 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004063
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004064 for (i = x+1; i < len; i += 2) {
4065 key =self->stack->data[i-1];
4066 value=self->stack->data[i ];
4067 if (PyObject_SetItem(dict, key, value) < 0) {
4068 r=-1;
4069 break;
4070 }
4071 }
4072
4073 Pdata_clear(self->stack, x);
4074
4075 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004076}
4077
4078
Tim Peters84e87f32001-03-17 04:50:51 +00004079static int
Tim Peterscba30e22003-02-01 06:24:36 +00004080load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004081{
4082 return do_setitems(self, self->stack->length - 2);
4083}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004084
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004085static int
Tim Peterscba30e22003-02-01 06:24:36 +00004086load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004087{
4088 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004089}
4090
Tim Peters84e87f32001-03-17 04:50:51 +00004091
Guido van Rossum60456fd1997-04-09 17:36:32 +00004092static int
Tim Peterscba30e22003-02-01 06:24:36 +00004093load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004094{
Tim Peters080c88b2003-02-15 03:01:11 +00004095 PyObject *state, *inst, *slotstate;
4096 PyObject *__setstate__;
4097 PyObject *d_key, *d_value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004098 Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00004099 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004100
Tim Peters080c88b2003-02-15 03:01:11 +00004101 /* Stack is ... instance, state. We want to leave instance at
4102 * the stack top, possibly mutated via instance.__setstate__(state).
4103 */
4104 if (self->stack->length < 2)
4105 return stackUnderflow();
4106 PDATA_POP(self->stack, state);
4107 if (state == NULL)
4108 return -1;
4109 inst = self->stack->data[self->stack->length - 1];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004110
Tim Peters080c88b2003-02-15 03:01:11 +00004111 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
4112 if (__setstate__ != NULL) {
4113 PyObject *junk = NULL;
4114
4115 /* The explicit __setstate__ is responsible for everything. */
4116 ARG_TUP(self, state);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004117 if (self->arg) {
4118 junk = PyObject_Call(__setstate__, self->arg, NULL);
4119 FREE_ARG_TUP(self);
4120 }
4121 Py_DECREF(__setstate__);
Tim Peters080c88b2003-02-15 03:01:11 +00004122 if (junk == NULL)
4123 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004124 Py_DECREF(junk);
4125 return 0;
4126 }
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00004127 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4128 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004129 PyErr_Clear();
Tim Peters080c88b2003-02-15 03:01:11 +00004130
4131 /* A default __setstate__. First see whether state embeds a
4132 * slot state dict too (a proto 2 addition).
4133 */
4134 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
4135 PyObject *temp = state;
4136 state = PyTuple_GET_ITEM(temp, 0);
4137 slotstate = PyTuple_GET_ITEM(temp, 1);
4138 Py_INCREF(state);
4139 Py_INCREF(slotstate);
4140 Py_DECREF(temp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004141 }
Tim Peters080c88b2003-02-15 03:01:11 +00004142 else
4143 slotstate = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004144
Tim Peters080c88b2003-02-15 03:01:11 +00004145 /* Set inst.__dict__ from the state dict (if any). */
4146 if (state != Py_None) {
4147 PyObject *dict;
4148 if (! PyDict_Check(state)) {
4149 PyErr_SetString(UnpicklingError, "state is not a "
4150 "dictionary");
4151 goto finally;
4152 }
4153 dict = PyObject_GetAttr(inst, __dict___str);
4154 if (dict == NULL)
4155 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004156
Tim Peters080c88b2003-02-15 03:01:11 +00004157 i = 0;
4158 while (PyDict_Next(state, &i, &d_key, &d_value)) {
4159 if (PyObject_SetItem(dict, d_key, d_value) < 0)
4160 goto finally;
4161 }
4162 Py_DECREF(dict);
4163 }
4164
4165 /* Also set instance attributes from the slotstate dict (if any). */
4166 if (slotstate != NULL) {
4167 if (! PyDict_Check(slotstate)) {
4168 PyErr_SetString(UnpicklingError, "slot state is not "
4169 "a dictionary");
4170 goto finally;
4171 }
4172 i = 0;
4173 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4174 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4175 goto finally;
4176 }
4177 }
4178 res = 0;
4179
4180 finally:
4181 Py_DECREF(state);
4182 Py_XDECREF(slotstate);
4183 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004184}
4185
4186
4187static int
Tim Peterscba30e22003-02-01 06:24:36 +00004188load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004189{
4190 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004192 /* Note that we split the (pickle.py) stack into two stacks, an
4193 object stack and a mark stack. Here we push a mark onto the
4194 mark stack.
4195 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004197 if ((self->num_marks + 1) >= self->marks_size) {
4198 s=self->marks_size+20;
4199 if (s <= self->num_marks) s=self->num_marks + 1;
4200 if (self->marks == NULL)
4201 self->marks=(int *)malloc(s * sizeof(int));
4202 else
Tim Peterscba30e22003-02-01 06:24:36 +00004203 self->marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004204 s * sizeof(int));
4205 if (! self->marks) {
4206 PyErr_NoMemory();
4207 return -1;
4208 }
4209 self->marks_size = s;
4210 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004212 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004214 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004215}
4216
Guido van Rossum60456fd1997-04-09 17:36:32 +00004217static int
Tim Peterscba30e22003-02-01 06:24:36 +00004218load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004219{
4220 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004221
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004222 PDATA_POP(self->stack, arg_tup);
4223 if (! arg_tup) return -1;
4224 PDATA_POP(self->stack, callable);
Guido van Rossum512ab9f2006-08-17 22:28:49 +00004225 if (callable) {
4226 ob = Instance_New(callable, arg_tup);
4227 Py_DECREF(callable);
4228 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004229 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004230
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004231 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004232
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004233 PDATA_PUSH(self->stack, ob, -1);
4234 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004235}
Tim Peters84e87f32001-03-17 04:50:51 +00004236
Tim Peters4190fb82003-02-02 16:09:05 +00004237/* Just raises an error if we don't know the protocol specified. PROTO
4238 * is the first opcode for protocols >= 2.
4239 */
4240static int
4241load_proto(Unpicklerobject *self)
4242{
4243 int i;
4244 char *protobyte;
4245
4246 i = self->read_func(self, &protobyte, 1);
4247 if (i < 0)
4248 return -1;
4249
4250 i = calc_binint(protobyte, 1);
4251 /* No point checking for < 0, since calc_binint returns an unsigned
4252 * int when chewing on 1 byte.
4253 */
4254 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004255 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004256 return 0;
4257
4258 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4259 return -1;
4260}
4261
Guido van Rossum60456fd1997-04-09 17:36:32 +00004262static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004263load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004264{
4265 PyObject *err = 0, *val = 0;
4266 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004268 self->num_marks = 0;
4269 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004270
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004271 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004272 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004273 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004274
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004275 switch (s[0]) {
4276 case NONE:
4277 if (load_none(self) < 0)
4278 break;
4279 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004280
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004281 case BININT:
4282 if (load_binint(self) < 0)
4283 break;
4284 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004285
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004286 case BININT1:
4287 if (load_binint1(self) < 0)
4288 break;
4289 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004290
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004291 case BININT2:
4292 if (load_binint2(self) < 0)
4293 break;
4294 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004295
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004296 case INT:
4297 if (load_int(self) < 0)
4298 break;
4299 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004300
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004301 case LONG:
4302 if (load_long(self) < 0)
4303 break;
4304 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004305
Tim Petersee1a53c2003-02-02 02:57:53 +00004306 case LONG1:
4307 if (load_counted_long(self, 1) < 0)
4308 break;
4309 continue;
4310
4311 case LONG4:
4312 if (load_counted_long(self, 4) < 0)
4313 break;
4314 continue;
4315
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004316 case FLOAT:
4317 if (load_float(self) < 0)
4318 break;
4319 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004320
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004321 case BINFLOAT:
4322 if (load_binfloat(self) < 0)
4323 break;
4324 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004325
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004326 case BINSTRING:
4327 if (load_binstring(self) < 0)
4328 break;
4329 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004330
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004331 case SHORT_BINSTRING:
4332 if (load_short_binstring(self) < 0)
4333 break;
4334 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004335
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004336 case STRING:
4337 if (load_string(self) < 0)
4338 break;
4339 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004340
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004341#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004342 case UNICODE:
4343 if (load_unicode(self) < 0)
4344 break;
4345 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004346
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004347 case BINUNICODE:
4348 if (load_binunicode(self) < 0)
4349 break;
4350 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004351#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004353 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004354 if (load_counted_tuple(self, 0) < 0)
4355 break;
4356 continue;
4357
4358 case TUPLE1:
4359 if (load_counted_tuple(self, 1) < 0)
4360 break;
4361 continue;
4362
4363 case TUPLE2:
4364 if (load_counted_tuple(self, 2) < 0)
4365 break;
4366 continue;
4367
4368 case TUPLE3:
4369 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004370 break;
4371 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004372
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004373 case TUPLE:
4374 if (load_tuple(self) < 0)
4375 break;
4376 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004377
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004378 case EMPTY_LIST:
4379 if (load_empty_list(self) < 0)
4380 break;
4381 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004382
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004383 case LIST:
4384 if (load_list(self) < 0)
4385 break;
4386 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004387
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004388 case EMPTY_DICT:
4389 if (load_empty_dict(self) < 0)
4390 break;
4391 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004392
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004393 case DICT:
4394 if (load_dict(self) < 0)
4395 break;
4396 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004397
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004398 case OBJ:
4399 if (load_obj(self) < 0)
4400 break;
4401 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004403 case INST:
4404 if (load_inst(self) < 0)
4405 break;
4406 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004407
Tim Peterseab7db32003-02-13 18:24:14 +00004408 case NEWOBJ:
4409 if (load_newobj(self) < 0)
4410 break;
4411 continue;
4412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004413 case GLOBAL:
4414 if (load_global(self) < 0)
4415 break;
4416 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004417
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004418 case APPEND:
4419 if (load_append(self) < 0)
4420 break;
4421 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004422
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004423 case APPENDS:
4424 if (load_appends(self) < 0)
4425 break;
4426 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004427
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004428 case BUILD:
4429 if (load_build(self) < 0)
4430 break;
4431 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004432
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004433 case DUP:
4434 if (load_dup(self) < 0)
4435 break;
4436 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004437
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004438 case BINGET:
4439 if (load_binget(self) < 0)
4440 break;
4441 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004442
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004443 case LONG_BINGET:
4444 if (load_long_binget(self) < 0)
4445 break;
4446 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004447
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004448 case GET:
4449 if (load_get(self) < 0)
4450 break;
4451 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004452
Tim Peters2d629652003-02-04 05:06:17 +00004453 case EXT1:
4454 if (load_extension(self, 1) < 0)
4455 break;
4456 continue;
4457
4458 case EXT2:
4459 if (load_extension(self, 2) < 0)
4460 break;
4461 continue;
4462
4463 case EXT4:
4464 if (load_extension(self, 4) < 0)
4465 break;
4466 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004467 case MARK:
4468 if (load_mark(self) < 0)
4469 break;
4470 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004471
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004472 case BINPUT:
4473 if (load_binput(self) < 0)
4474 break;
4475 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004476
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004477 case LONG_BINPUT:
4478 if (load_long_binput(self) < 0)
4479 break;
4480 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004481
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004482 case PUT:
4483 if (load_put(self) < 0)
4484 break;
4485 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004486
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004487 case POP:
4488 if (load_pop(self) < 0)
4489 break;
4490 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004491
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004492 case POP_MARK:
4493 if (load_pop_mark(self) < 0)
4494 break;
4495 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004496
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004497 case SETITEM:
4498 if (load_setitem(self) < 0)
4499 break;
4500 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004501
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004502 case SETITEMS:
4503 if (load_setitems(self) < 0)
4504 break;
4505 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004506
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004507 case STOP:
4508 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004510 case PERSID:
4511 if (load_persid(self) < 0)
4512 break;
4513 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004515 case BINPERSID:
4516 if (load_binpersid(self) < 0)
4517 break;
4518 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004519
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004520 case REDUCE:
4521 if (load_reduce(self) < 0)
4522 break;
4523 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004524
Tim Peters4190fb82003-02-02 16:09:05 +00004525 case PROTO:
4526 if (load_proto(self) < 0)
4527 break;
4528 continue;
4529
Tim Peters3c67d792003-02-02 17:59:11 +00004530 case NEWTRUE:
4531 if (load_bool(self, Py_True) < 0)
4532 break;
4533 continue;
4534
4535 case NEWFALSE:
4536 if (load_bool(self, Py_False) < 0)
4537 break;
4538 continue;
4539
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004540 case '\0':
4541 /* end of file */
4542 PyErr_SetNone(PyExc_EOFError);
4543 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004545 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004546 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004547 "invalid load key, '%s'.",
4548 "c", s[0]);
4549 return NULL;
4550 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004552 break;
4553 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004555 if ((err = PyErr_Occurred())) {
4556 if (err == PyExc_EOFError) {
4557 PyErr_SetNone(PyExc_EOFError);
4558 }
4559 return NULL;
4560 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004561
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004562 PDATA_POP(self->stack, val);
4563 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004564}
Tim Peters84e87f32001-03-17 04:50:51 +00004565
Guido van Rossum60456fd1997-04-09 17:36:32 +00004566
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004567/* No-load functions to support noload, which is used to
4568 find persistent references. */
4569
4570static int
Tim Peterscba30e22003-02-01 06:24:36 +00004571noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004572{
4573 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004574
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004575 if ((i = marker(self)) < 0) return -1;
4576 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004577}
4578
4579
4580static int
Tim Peterscba30e22003-02-01 06:24:36 +00004581noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004582{
4583 int i;
4584 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004585
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004586 if ((i = marker(self)) < 0) return -1;
4587 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004588 if (self->readline_func(self, &s) < 0) return -1;
4589 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00004590 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004591 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004592}
4593
4594static int
Tim Peterseab7db32003-02-13 18:24:14 +00004595noload_newobj(Unpicklerobject *self)
4596{
4597 PyObject *obj;
4598
4599 PDATA_POP(self->stack, obj); /* pop argtuple */
4600 if (obj == NULL) return -1;
4601 Py_DECREF(obj);
4602
4603 PDATA_POP(self->stack, obj); /* pop cls */
4604 if (obj == NULL) return -1;
4605 Py_DECREF(obj);
4606
4607 PDATA_APPEND(self->stack, Py_None, -1);
4608 return 0;
4609}
4610
4611static int
Tim Peterscba30e22003-02-01 06:24:36 +00004612noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004613{
4614 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004615
Tim Peters0bc93f52003-02-02 18:29:33 +00004616 if (self->readline_func(self, &s) < 0) return -1;
4617 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004618 PDATA_APPEND(self->stack, Py_None,-1);
4619 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004620}
4621
4622static int
Tim Peterscba30e22003-02-01 06:24:36 +00004623noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004624{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004625
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004626 if (self->stack->length < 2) return stackUnderflow();
4627 Pdata_clear(self->stack, self->stack->length-2);
4628 PDATA_APPEND(self->stack, Py_None,-1);
4629 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004630}
4631
4632static int
4633noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004634
Guido van Rossum053b8df1998-11-25 16:18:00 +00004635 if (self->stack->length < 1) return stackUnderflow();
4636 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004637 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004638}
4639
Tim Peters2d629652003-02-04 05:06:17 +00004640static int
4641noload_extension(Unpicklerobject *self, int nbytes)
4642{
4643 char *codebytes;
4644
4645 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4646 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4647 PDATA_APPEND(self->stack, Py_None, -1);
4648 return 0;
4649}
4650
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004651
4652static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004653noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004654{
4655 PyObject *err = 0, *val = 0;
4656 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004657
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004658 self->num_marks = 0;
4659 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004660
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004661 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004662 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004663 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004665 switch (s[0]) {
4666 case NONE:
4667 if (load_none(self) < 0)
4668 break;
4669 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004670
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004671 case BININT:
4672 if (load_binint(self) < 0)
4673 break;
4674 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004675
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004676 case BININT1:
4677 if (load_binint1(self) < 0)
4678 break;
4679 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004680
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004681 case BININT2:
4682 if (load_binint2(self) < 0)
4683 break;
4684 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004685
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004686 case INT:
4687 if (load_int(self) < 0)
4688 break;
4689 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004690
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004691 case LONG:
4692 if (load_long(self) < 0)
4693 break;
4694 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004695
Tim Peters4190fb82003-02-02 16:09:05 +00004696 case LONG1:
4697 if (load_counted_long(self, 1) < 0)
4698 break;
4699 continue;
4700
4701 case LONG4:
4702 if (load_counted_long(self, 4) < 0)
4703 break;
4704 continue;
4705
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004706 case FLOAT:
4707 if (load_float(self) < 0)
4708 break;
4709 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004710
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004711 case BINFLOAT:
4712 if (load_binfloat(self) < 0)
4713 break;
4714 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004715
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004716 case BINSTRING:
4717 if (load_binstring(self) < 0)
4718 break;
4719 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004721 case SHORT_BINSTRING:
4722 if (load_short_binstring(self) < 0)
4723 break;
4724 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004725
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004726 case STRING:
4727 if (load_string(self) < 0)
4728 break;
4729 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004730
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004731#ifdef Py_USING_UNICODE
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004732 case UNICODE:
4733 if (load_unicode(self) < 0)
4734 break;
4735 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004736
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004737 case BINUNICODE:
4738 if (load_binunicode(self) < 0)
4739 break;
4740 continue;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004741#endif
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004742
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004743 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004744 if (load_counted_tuple(self, 0) < 0)
4745 break;
4746 continue;
4747
4748 case TUPLE1:
4749 if (load_counted_tuple(self, 1) < 0)
4750 break;
4751 continue;
4752
4753 case TUPLE2:
4754 if (load_counted_tuple(self, 2) < 0)
4755 break;
4756 continue;
4757
4758 case TUPLE3:
4759 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004760 break;
4761 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004763 case TUPLE:
4764 if (load_tuple(self) < 0)
4765 break;
4766 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004767
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004768 case EMPTY_LIST:
4769 if (load_empty_list(self) < 0)
4770 break;
4771 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004773 case LIST:
4774 if (load_list(self) < 0)
4775 break;
4776 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004777
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004778 case EMPTY_DICT:
4779 if (load_empty_dict(self) < 0)
4780 break;
4781 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004782
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004783 case DICT:
4784 if (load_dict(self) < 0)
4785 break;
4786 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004787
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004788 case OBJ:
4789 if (noload_obj(self) < 0)
4790 break;
4791 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004792
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004793 case INST:
4794 if (noload_inst(self) < 0)
4795 break;
4796 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004797
Tim Peterseab7db32003-02-13 18:24:14 +00004798 case NEWOBJ:
4799 if (noload_newobj(self) < 0)
4800 break;
4801 continue;
4802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004803 case GLOBAL:
4804 if (noload_global(self) < 0)
4805 break;
4806 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004807
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004808 case APPEND:
4809 if (load_append(self) < 0)
4810 break;
4811 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004813 case APPENDS:
4814 if (load_appends(self) < 0)
4815 break;
4816 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004818 case BUILD:
4819 if (noload_build(self) < 0)
4820 break;
4821 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004822
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004823 case DUP:
4824 if (load_dup(self) < 0)
4825 break;
4826 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004827
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004828 case BINGET:
4829 if (load_binget(self) < 0)
4830 break;
4831 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004833 case LONG_BINGET:
4834 if (load_long_binget(self) < 0)
4835 break;
4836 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004837
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004838 case GET:
4839 if (load_get(self) < 0)
4840 break;
4841 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004842
Tim Peters2d629652003-02-04 05:06:17 +00004843 case EXT1:
4844 if (noload_extension(self, 1) < 0)
4845 break;
4846 continue;
4847
4848 case EXT2:
4849 if (noload_extension(self, 2) < 0)
4850 break;
4851 continue;
4852
4853 case EXT4:
4854 if (noload_extension(self, 4) < 0)
4855 break;
4856 continue;
4857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004858 case MARK:
4859 if (load_mark(self) < 0)
4860 break;
4861 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004862
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004863 case BINPUT:
4864 if (load_binput(self) < 0)
4865 break;
4866 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004868 case LONG_BINPUT:
4869 if (load_long_binput(self) < 0)
4870 break;
4871 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004872
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004873 case PUT:
4874 if (load_put(self) < 0)
4875 break;
4876 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004877
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004878 case POP:
4879 if (load_pop(self) < 0)
4880 break;
4881 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004883 case POP_MARK:
4884 if (load_pop_mark(self) < 0)
4885 break;
4886 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004887
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004888 case SETITEM:
4889 if (load_setitem(self) < 0)
4890 break;
4891 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004892
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004893 case SETITEMS:
4894 if (load_setitems(self) < 0)
4895 break;
4896 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004897
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004898 case STOP:
4899 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004901 case PERSID:
4902 if (load_persid(self) < 0)
4903 break;
4904 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004905
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004906 case BINPERSID:
4907 if (load_binpersid(self) < 0)
4908 break;
4909 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004910
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004911 case REDUCE:
4912 if (noload_reduce(self) < 0)
4913 break;
4914 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004915
Tim Peters4190fb82003-02-02 16:09:05 +00004916 case PROTO:
4917 if (load_proto(self) < 0)
4918 break;
4919 continue;
4920
Tim Peters3c67d792003-02-02 17:59:11 +00004921 case NEWTRUE:
4922 if (load_bool(self, Py_True) < 0)
4923 break;
4924 continue;
4925
4926 case NEWFALSE:
4927 if (load_bool(self, Py_False) < 0)
4928 break;
4929 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004930 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004931 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004932 "invalid load key, '%s'.",
4933 "c", s[0]);
4934 return NULL;
4935 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004936
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004937 break;
4938 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004939
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004940 if ((err = PyErr_Occurred())) {
4941 if (err == PyExc_EOFError) {
4942 PyErr_SetNone(PyExc_EOFError);
4943 }
4944 return NULL;
4945 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004947 PDATA_POP(self->stack, val);
4948 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004949}
Tim Peters84e87f32001-03-17 04:50:51 +00004950
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004951
Guido van Rossum60456fd1997-04-09 17:36:32 +00004952static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004953Unpickler_load(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004954{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004955 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004956}
4957
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004958static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004959Unpickler_noload(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004960{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004961 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004962}
4963
Guido van Rossum60456fd1997-04-09 17:36:32 +00004964
4965static struct PyMethodDef Unpickler_methods[] = {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004966 {"load", (PyCFunction)Unpickler_load, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004967 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004968 },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004969 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004970 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004971 "noload() -- not load a pickle, but go through most of the motions\n"
4972 "\n"
4973 "This function can be used to read past a pickle without instantiating\n"
4974 "any objects or importing any modules. It can also be used to find all\n"
4975 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004976 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004977 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004978 {NULL, NULL} /* sentinel */
4979};
4980
4981
4982static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004983newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004984{
4985 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004986
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004987 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004988 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004989
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004990 self->file = NULL;
4991 self->arg = NULL;
4992 self->stack = (Pdata*)Pdata_New();
4993 self->pers_func = NULL;
4994 self->last_string = NULL;
4995 self->marks = NULL;
4996 self->num_marks = 0;
4997 self->marks_size = 0;
4998 self->buf_size = 0;
4999 self->read = NULL;
5000 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005001 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005002
Tim Peterscba30e22003-02-01 06:24:36 +00005003 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005004 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005005
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005006 if (!self->stack)
5007 goto err;
5008
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005009 Py_INCREF(f);
5010 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005011
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005012 /* Set read, readline based on type of f */
5013 if (PyFile_Check(f)) {
5014 self->fp = PyFile_AsFile(f);
5015 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00005016 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005017 "I/O operation on closed file");
5018 goto err;
5019 }
5020 self->read_func = read_file;
5021 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00005022 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005023 else if (PycStringIO_InputCheck(f)) {
5024 self->fp = NULL;
5025 self->read_func = read_cStringIO;
5026 self->readline_func = readline_cStringIO;
5027 }
5028 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00005029
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005030 self->fp = NULL;
5031 self->read_func = read_other;
5032 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005033
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005034 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
5035 (self->read = PyObject_GetAttr(f, read_str)))) {
5036 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00005037 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005038 "argument must have 'read' and "
5039 "'readline' attributes" );
5040 goto err;
5041 }
5042 }
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005043 PyObject_GC_Track(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005044
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005045 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005046
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005047 err:
5048 Py_DECREF((PyObject *)self);
5049 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005050}
5051
5052
5053static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005054get_Unpickler(PyObject *self, PyObject *file)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005055{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005056 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005057}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005058
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005059
Guido van Rossum60456fd1997-04-09 17:36:32 +00005060static void
Tim Peterscba30e22003-02-01 06:24:36 +00005061Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005062{
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005063 PyObject_GC_UnTrack((PyObject *)self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005064 Py_XDECREF(self->readline);
5065 Py_XDECREF(self->read);
5066 Py_XDECREF(self->file);
5067 Py_XDECREF(self->memo);
5068 Py_XDECREF(self->stack);
5069 Py_XDECREF(self->pers_func);
5070 Py_XDECREF(self->arg);
5071 Py_XDECREF(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00005072 Py_XDECREF(self->find_class);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005073
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005074 if (self->marks) {
5075 free(self->marks);
5076 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005077
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005078 if (self->buf_size) {
5079 free(self->buf);
5080 }
Tim Peters84e87f32001-03-17 04:50:51 +00005081
Tim Peters3cfe7542003-05-21 21:29:48 +00005082 self->ob_type->tp_free((PyObject *)self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005083}
5084
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005085static int
5086Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
5087{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005088 Py_VISIT(self->readline);
5089 Py_VISIT(self->read);
5090 Py_VISIT(self->file);
5091 Py_VISIT(self->memo);
5092 Py_VISIT(self->stack);
5093 Py_VISIT(self->pers_func);
5094 Py_VISIT(self->arg);
5095 Py_VISIT(self->last_string);
5096 Py_VISIT(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005097 return 0;
5098}
5099
5100static int
5101Unpickler_clear(Unpicklerobject *self)
5102{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005103 Py_CLEAR(self->readline);
5104 Py_CLEAR(self->read);
5105 Py_CLEAR(self->file);
5106 Py_CLEAR(self->memo);
5107 Py_CLEAR(self->stack);
5108 Py_CLEAR(self->pers_func);
5109 Py_CLEAR(self->arg);
5110 Py_CLEAR(self->last_string);
5111 Py_CLEAR(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005112 return 0;
5113}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005114
5115static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005116Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005117{
5118 if (!strcmp(name, "persistent_load")) {
5119 if (!self->pers_func) {
5120 PyErr_SetString(PyExc_AttributeError, name);
5121 return NULL;
5122 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005123
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005124 Py_INCREF(self->pers_func);
5125 return self->pers_func;
5126 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005128 if (!strcmp(name, "find_global")) {
5129 if (!self->find_class) {
5130 PyErr_SetString(PyExc_AttributeError, name);
5131 return NULL;
5132 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005133
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005134 Py_INCREF(self->find_class);
5135 return self->find_class;
5136 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005137
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005138 if (!strcmp(name, "memo")) {
5139 if (!self->memo) {
5140 PyErr_SetString(PyExc_AttributeError, name);
5141 return NULL;
5142 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005144 Py_INCREF(self->memo);
5145 return self->memo;
5146 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005148 if (!strcmp(name, "UnpicklingError")) {
5149 Py_INCREF(UnpicklingError);
5150 return UnpicklingError;
5151 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005152
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005153 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005154}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005155
Guido van Rossum60456fd1997-04-09 17:36:32 +00005156
5157static int
Tim Peterscba30e22003-02-01 06:24:36 +00005158Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005159{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005160
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005161 if (!strcmp(name, "persistent_load")) {
5162 Py_XDECREF(self->pers_func);
5163 self->pers_func = value;
5164 Py_XINCREF(value);
5165 return 0;
5166 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005167
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005168 if (!strcmp(name, "find_global")) {
5169 Py_XDECREF(self->find_class);
5170 self->find_class = value;
5171 Py_XINCREF(value);
5172 return 0;
5173 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005174
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005175 if (! value) {
5176 PyErr_SetString(PyExc_TypeError,
5177 "attribute deletion is not supported");
5178 return -1;
5179 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005180
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005181 if (strcmp(name, "memo") == 0) {
5182 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005183 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005184 "memo must be a dictionary");
5185 return -1;
5186 }
5187 Py_XDECREF(self->memo);
5188 self->memo = value;
5189 Py_INCREF(value);
5190 return 0;
5191 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005192
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005193 PyErr_SetString(PyExc_AttributeError, name);
5194 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005195}
5196
Tim Peters5bd2a792003-02-01 16:45:06 +00005197/* ---------------------------------------------------------------------------
5198 * Module-level functions.
5199 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005200
Martin v. Löwis544f1192004-07-27 05:22:33 +00005201/* dump(obj, file, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005202static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005203cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005204{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005205 static char *kwlist[] = {"obj", "file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005206 PyObject *ob, *file, *res = NULL;
5207 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005208 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005209
Martin v. Löwis544f1192004-07-27 05:22:33 +00005210 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5211 &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005212 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005213
Tim Peters5bd2a792003-02-01 16:45:06 +00005214 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005215 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005217 if (dump(pickler, ob) < 0)
5218 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005219
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005220 Py_INCREF(Py_None);
5221 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005222
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005223 finally:
5224 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005225
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005226 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005227}
5228
5229
Martin v. Löwis544f1192004-07-27 05:22:33 +00005230/* dumps(obj, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005231static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005232cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005233{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005234 static char *kwlist[] = {"obj", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005235 PyObject *ob, *file = 0, *res = NULL;
5236 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005237 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005238
Martin v. Löwis544f1192004-07-27 05:22:33 +00005239 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5240 &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005241 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005242
Tim Peterscba30e22003-02-01 06:24:36 +00005243 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005244 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005245
Tim Peters5bd2a792003-02-01 16:45:06 +00005246 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005247 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005248
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005249 if (dump(pickler, ob) < 0)
5250 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005251
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005252 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005253
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005254 finally:
5255 Py_XDECREF(pickler);
5256 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005257
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005258 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005259}
5260
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005261
Tim Peters5bd2a792003-02-01 16:45:06 +00005262/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005263static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005264cpm_load(PyObject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005265{
5266 Unpicklerobject *unpickler = 0;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005267 PyObject *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005268
Tim Peterscba30e22003-02-01 06:24:36 +00005269 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005270 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005272 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005273
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005274 finally:
5275 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005276
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005277 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005278}
5279
5280
Tim Peters5bd2a792003-02-01 16:45:06 +00005281/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005282static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005283cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005284{
5285 PyObject *ob, *file = 0, *res = NULL;
5286 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005287
Tim Peterscba30e22003-02-01 06:24:36 +00005288 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005289 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005290
Tim Peterscba30e22003-02-01 06:24:36 +00005291 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005292 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005293
Tim Peterscba30e22003-02-01 06:24:36 +00005294 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005295 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005297 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005298
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005299 finally:
5300 Py_XDECREF(file);
5301 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005302
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005303 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005304}
5305
5306
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005307PyDoc_STRVAR(Unpicklertype__doc__,
5308"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005309
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005310static PyTypeObject Unpicklertype = {
5311 PyObject_HEAD_INIT(NULL)
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005312 0, /*ob_size*/
5313 "cPickle.Unpickler", /*tp_name*/
5314 sizeof(Unpicklerobject), /*tp_basicsize*/
5315 0,
5316 (destructor)Unpickler_dealloc, /* tp_dealloc */
5317 0, /* tp_print */
5318 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5319 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5320 0, /* tp_compare */
5321 0, /* tp_repr */
5322 0, /* tp_as_number */
5323 0, /* tp_as_sequence */
5324 0, /* tp_as_mapping */
5325 0, /* tp_hash */
5326 0, /* tp_call */
5327 0, /* tp_str */
5328 0, /* tp_getattro */
5329 0, /* tp_setattro */
5330 0, /* tp_as_buffer */
5331 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5332 Unpicklertype__doc__, /* tp_doc */
5333 (traverseproc)Unpickler_traverse, /* tp_traverse */
5334 (inquiry)Unpickler_clear, /* tp_clear */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005335};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005336
Guido van Rossum60456fd1997-04-09 17:36:32 +00005337static struct PyMethodDef cPickle_methods[] = {
Martin v. Löwis544f1192004-07-27 05:22:33 +00005338 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5339 PyDoc_STR("dump(obj, file, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005340 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005341 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005342 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005343 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005344
Martin v. Löwis544f1192004-07-27 05:22:33 +00005345 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5346 PyDoc_STR("dumps(obj, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005347 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005348 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005349 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005350 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005351
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005352 {"load", (PyCFunction)cpm_load, METH_O,
Neal Norwitz200788c2002-08-13 22:20:41 +00005353 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005354
Neal Norwitzb0493252002-03-31 14:44:22 +00005355 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005356 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005357
Martin v. Löwis544f1192004-07-27 05:22:33 +00005358 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5359 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005360 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005361 "This takes a file-like object for writing a pickle data stream.\n"
5362 "The optional proto argument tells the pickler to use the given\n"
5363 "protocol; supported protocols are 0, 1, 2. The default\n"
5364 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5365 "only protocol that can be written to a file opened in text\n"
5366 "mode and read back successfully. When using a protocol higher\n"
5367 "than 0, make sure the file is opened in binary mode, both when\n"
5368 "pickling and unpickling.)\n"
5369 "\n"
5370 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5371 "more efficient than protocol 1.\n"
5372 "\n"
5373 "Specifying a negative protocol version selects the highest\n"
5374 "protocol version supported. The higher the protocol used, the\n"
5375 "more recent the version of Python needed to read the pickle\n"
5376 "produced.\n"
5377 "\n"
5378 "The file parameter must have a write() method that accepts a single\n"
5379 "string argument. It can thus be an open file object, a StringIO\n"
5380 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005381 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005382
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005383 {"Unpickler", (PyCFunction)get_Unpickler, METH_O,
Tim Peters5bd2a792003-02-01 16:45:06 +00005384 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5385
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005386 { NULL, NULL }
5387};
5388
Guido van Rossum60456fd1997-04-09 17:36:32 +00005389static int
Tim Peterscba30e22003-02-01 06:24:36 +00005390init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005391{
5392 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005393
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00005394#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005395
Tim Peters3cfe7542003-05-21 21:29:48 +00005396 if (PyType_Ready(&Unpicklertype) < 0)
5397 return -1;
5398 if (PyType_Ready(&Picklertype) < 0)
5399 return -1;
5400
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005401 INIT_STR(__class__);
5402 INIT_STR(__getinitargs__);
5403 INIT_STR(__dict__);
5404 INIT_STR(__getstate__);
5405 INIT_STR(__setstate__);
5406 INIT_STR(__name__);
5407 INIT_STR(__main__);
5408 INIT_STR(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00005409 INIT_STR(__reduce_ex__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005410 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005411 INIT_STR(append);
5412 INIT_STR(read);
5413 INIT_STR(readline);
5414 INIT_STR(copy_reg);
5415 INIT_STR(dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005416
Tim Peterscba30e22003-02-01 06:24:36 +00005417 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005418 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005419
Tim Peters1f1b2d22003-02-01 02:16:37 +00005420 /* This is special because we want to use a different
5421 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005422 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005423 if (!dispatch_table) return -1;
5424
5425 extension_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005426 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005427 if (!extension_registry) return -1;
5428
5429 inverted_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005430 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005431 if (!inverted_registry) return -1;
5432
5433 extension_cache = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005434 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005435 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005437 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005438
Tim Peters731098b2003-02-04 20:56:09 +00005439 if (!(empty_tuple = PyTuple_New(0)))
5440 return -1;
5441
5442 two_tuple = PyTuple_New(2);
5443 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005444 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005445 /* We use this temp container with no regard to refcounts, or to
5446 * keeping containees alive. Exempt from GC, because we don't
5447 * want anything looking at two_tuple() by magic.
5448 */
5449 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005450
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005451 /* Ugh */
5452 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5453 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5454 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005455
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005456 if (!( t=PyDict_New())) return -1;
5457 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005458 "def __str__(self):\n"
5459 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5460 Py_file_input,
5461 module_dict, t) )) return -1;
5462 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005463
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005464 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005465 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005466 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005467
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005468 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005469
Tim Peterscba30e22003-02-01 06:24:36 +00005470 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005471 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005472 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005473 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005474
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005475 if (!( t=PyDict_New())) return -1;
5476 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005477 "def __str__(self):\n"
5478 " a=self.args\n"
5479 " a=a and type(a[0]) or '(what)'\n"
5480 " return 'Cannot pickle %s objects' % a\n"
5481 , Py_file_input,
5482 module_dict, t) )) return -1;
5483 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005484
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005485 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005486 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005487 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005489 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005490
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005491 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005492 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005493 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005494
Martin v. Löwis658009a2002-09-16 17:26:24 +00005495 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5496 UnpicklingError, NULL)))
5497 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005499 if (PyDict_SetItemString(module_dict, "PickleError",
5500 PickleError) < 0)
5501 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005502
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005503 if (PyDict_SetItemString(module_dict, "PicklingError",
5504 PicklingError) < 0)
5505 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005506
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005507 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5508 UnpicklingError) < 0)
5509 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005510
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005511 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5512 UnpickleableError) < 0)
5513 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005514
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005515 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5516 BadPickleGet) < 0)
5517 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005518
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005519 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005520
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005521 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005522}
5523
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005524#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5525#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005526#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005527PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005528initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005529{
5530 PyObject *m, *d, *di, *v, *k;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005531 Py_ssize_t i;
Tim Peters5b7da392003-02-04 00:21:07 +00005532 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005533 PyObject *format_version;
5534 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005535
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005536 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005537 Unpicklertype.ob_type = &PyType_Type;
5538 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005539
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005540 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005541 * so we're forced to use a temporary dictionary. :(
5542 */
5543 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005544 if (!di) return;
5545 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005546
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005547 /* Create the module and add the functions */
5548 m = Py_InitModule4("cPickle", cPickle_methods,
5549 cPickle_module_documentation,
5550 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00005551 if (m == NULL)
5552 return;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005554 /* Add some symbolic constants to the module */
5555 d = PyModule_GetDict(m);
Tim Peters5b7da392003-02-04 00:21:07 +00005556 v = PyString_FromString(rev);
5557 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005558 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005559
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005560 /* Copy data from di. Waaa. */
5561 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5562 if (PyObject_SetItem(d, k, v) < 0) {
5563 Py_DECREF(di);
5564 return;
5565 }
5566 }
5567 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005568
Tim Peters8587b3c2003-02-13 15:44:41 +00005569 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
5570 if (i < 0)
5571 return;
5572
Tim Peters5b7da392003-02-04 00:21:07 +00005573 /* These are purely informational; no code uses them. */
5574 /* File format version we write. */
5575 format_version = PyString_FromString("2.0");
5576 /* Format versions we can read. */
5577 compatible_formats = Py_BuildValue("[sssss]",
5578 "1.0", /* Original protocol 0 */
5579 "1.1", /* Protocol 0 + INST */
5580 "1.2", /* Original protocol 1 */
5581 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005582 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005583 PyDict_SetItemString(d, "format_version", format_version);
5584 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5585 Py_XDECREF(format_version);
5586 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005587}