blob: 9ce3f651c40aeeaf2f609bb8d8d516c423380f12 [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) {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000536 char *newbuf = (char *)realloc(self->buf, n);
537 if (!newbuf) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000538 PyErr_NoMemory();
539 return -1;
540 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000541 self->buf = newbuf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000542 self->buf_size = n;
543 }
Tim Peters84e87f32001-03-17 04:50:51 +0000544
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000545 Py_BEGIN_ALLOW_THREADS
546 nbytesread = fread(self->buf, sizeof(char), n, self->fp);
547 Py_END_ALLOW_THREADS
548 if (nbytesread != (size_t)n) {
549 if (feof(self->fp)) {
550 PyErr_SetNone(PyExc_EOFError);
551 return -1;
552 }
Tim Peterscba30e22003-02-01 06:24:36 +0000553
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000554 PyErr_SetFromErrno(PyExc_IOError);
555 return -1;
556 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000557
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000558 *s = self->buf;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000559
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000560 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000561}
562
563
Martin v. Löwis18e16552006-02-15 17:27:45 +0000564static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000565readline_file(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000566{
567 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000568
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000569 if (self->buf_size == 0) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000570 if (!( self->buf = (char *)malloc(40))) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000571 PyErr_NoMemory();
572 return -1;
573 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000574 self->buf_size = 40;
575 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000576
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000577 i = 0;
578 while (1) {
Tim Petersee1a53c2003-02-02 02:57:53 +0000579 int bigger;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000580 char *newbuf;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000581 for (; i < (self->buf_size - 1); i++) {
Tim Peterscba30e22003-02-01 06:24:36 +0000582 if (feof(self->fp) ||
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000583 (self->buf[i] = getc(self->fp)) == '\n') {
584 self->buf[i + 1] = '\0';
585 *s = self->buf;
586 return i + 1;
587 }
588 }
Tim Petersee1a53c2003-02-02 02:57:53 +0000589 bigger = self->buf_size << 1;
590 if (bigger <= 0) { /* overflow */
591 PyErr_NoMemory();
592 return -1;
593 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000594 newbuf = (char *)realloc(self->buf, bigger);
595 if (!newbuf) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000596 PyErr_NoMemory();
597 return -1;
598 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000599 self->buf = newbuf;
Tim Petersee1a53c2003-02-02 02:57:53 +0000600 self->buf_size = bigger;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000601 }
Tim Peters84e87f32001-03-17 04:50:51 +0000602}
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000603
604
Martin v. Löwis18e16552006-02-15 17:27:45 +0000605static Py_ssize_t
606read_cStringIO(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000607{
608 char *ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000609
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000610 if (PycStringIO->cread((PyObject *)self->file, &ptr, n) != n) {
611 PyErr_SetNone(PyExc_EOFError);
612 return -1;
613 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000614
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000615 *s = ptr;
Tim Peterscba30e22003-02-01 06:24:36 +0000616
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000617 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000618}
619
620
Martin v. Löwis18e16552006-02-15 17:27:45 +0000621static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000622readline_cStringIO(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000623{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000624 Py_ssize_t n;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000625 char *ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000626
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000627 if ((n = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {
628 return -1;
629 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000630
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000631 *s = ptr;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000632
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000633 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000634}
635
636
Martin v. Löwis18e16552006-02-15 17:27:45 +0000637static Py_ssize_t
638read_other(Unpicklerobject *self, char **s, Py_ssize_t n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000639{
640 PyObject *bytes, *str=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000641
Martin v. Löwis18e16552006-02-15 17:27:45 +0000642 if (!( bytes = PyInt_FromSsize_t(n))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000643
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000644 ARG_TUP(self, bytes);
645 if (self->arg) {
646 str = PyObject_Call(self->read, self->arg, NULL);
647 FREE_ARG_TUP(self);
648 }
649 if (! str) return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000650
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000651 Py_XDECREF(self->last_string);
652 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000653
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000654 if (! (*s = PyString_AsString(str))) return -1;
655 return n;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000656}
657
658
Martin v. Löwis18e16552006-02-15 17:27:45 +0000659static Py_ssize_t
Tim Peterscba30e22003-02-01 06:24:36 +0000660readline_other(Unpicklerobject *self, char **s)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000661{
662 PyObject *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000663 Py_ssize_t str_size;
Tim Peterscba30e22003-02-01 06:24:36 +0000664
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000665 if (!( str = PyObject_CallObject(self->readline, empty_tuple))) {
666 return -1;
667 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000668
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000669 if ((str_size = PyString_Size(str)) < 0)
670 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000672 Py_XDECREF(self->last_string);
673 self->last_string = str;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000674
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000675 if (! (*s = PyString_AsString(str)))
676 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000677
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000678 return str_size;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000679}
680
Tim Petersee1a53c2003-02-02 02:57:53 +0000681/* Copy the first n bytes from s into newly malloc'ed memory, plus a
682 * trailing 0 byte. Return a pointer to that, or NULL if out of memory.
683 * The caller is responsible for free()'ing the return value.
684 */
Guido van Rossum60456fd1997-04-09 17:36:32 +0000685static char *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000686pystrndup(const char *s, int n)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000687{
Tim Petersee1a53c2003-02-02 02:57:53 +0000688 char *r = (char *)malloc(n+1);
689 if (r == NULL)
690 return (char*)PyErr_NoMemory();
691 memcpy(r, s, n);
692 r[n] = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000693 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000694}
695
696
697static int
Tim Peterscba30e22003-02-01 06:24:36 +0000698get(Picklerobject *self, PyObject *id)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000699{
700 PyObject *value, *mv;
701 long c_value;
702 char s[30];
703 size_t len;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000704
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000705 if (!( mv = PyDict_GetItem(self->memo, id))) {
706 PyErr_SetObject(PyExc_KeyError, id);
707 return -1;
708 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000709
Tim Peterscba30e22003-02-01 06:24:36 +0000710 if (!( value = PyTuple_GetItem(mv, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000711 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +0000712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000713 if (!( PyInt_Check(value))) {
714 PyErr_SetString(PicklingError, "no int where int expected in memo");
715 return -1;
716 }
Guido van Rossumddefaf32007-01-14 03:31:43 +0000717 c_value = PyInt_AsLong(value);
718 if (c_value == -1 && PyErr_Occurred())
719 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000720
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000721 if (!self->bin) {
722 s[0] = GET;
723 PyOS_snprintf(s + 1, sizeof(s) - 1, "%ld\n", c_value);
724 len = strlen(s);
725 }
726 else if (Pdata_Check(self->file)) {
727 if (write_other(self, NULL, 0) < 0) return -1;
728 PDATA_APPEND(self->file, mv, -1);
729 return 0;
730 }
731 else {
732 if (c_value < 256) {
733 s[0] = BINGET;
734 s[1] = (int)(c_value & 0xff);
735 len = 2;
736 }
737 else {
738 s[0] = LONG_BINGET;
739 s[1] = (int)(c_value & 0xff);
740 s[2] = (int)((c_value >> 8) & 0xff);
741 s[3] = (int)((c_value >> 16) & 0xff);
742 s[4] = (int)((c_value >> 24) & 0xff);
743 len = 5;
744 }
745 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000746
Tim Peters0bc93f52003-02-02 18:29:33 +0000747 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000748 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +0000749
Jeremy Hyltona0fb1772001-10-12 04:11:06 +0000750 return 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000751}
Jeremy Hyltonce616e41998-08-13 23:13:52 +0000752
Guido van Rossum60456fd1997-04-09 17:36:32 +0000753
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000754static int
Tim Peterscba30e22003-02-01 06:24:36 +0000755put(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000756{
Tim Peterscba30e22003-02-01 06:24:36 +0000757 if (ob->ob_refcnt < 2 || self->fast)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000758 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000759
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000760 return put2(self, ob);
761}
Guido van Rossum053b8df1998-11-25 16:18:00 +0000762
Guido van Rossum053b8df1998-11-25 16:18:00 +0000763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000764static int
Tim Peterscba30e22003-02-01 06:24:36 +0000765put2(Picklerobject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000766{
767 char c_str[30];
768 int p;
769 size_t len;
770 int res = -1;
771 PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000772
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000773 if (self->fast)
774 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000775
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000776 if ((p = PyDict_Size(self->memo)) < 0)
777 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +0000778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000779 /* Make sure memo keys are positive! */
Tim Peters70b02d72003-02-02 17:26:40 +0000780 /* XXX Why?
781 * XXX And does "positive" really mean non-negative?
782 * XXX pickle.py starts with PUT index 0, not 1. This makes for
783 * XXX gratuitous differences between the pickling modules.
784 */
Tim Peterscba30e22003-02-01 06:24:36 +0000785 p++;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000786
Tim Peterscba30e22003-02-01 06:24:36 +0000787 if (!( py_ob_id = PyLong_FromVoidPtr(ob)))
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 (!( memo_len = PyInt_FromLong(p)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000791 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000792
Tim Peterscba30e22003-02-01 06:24:36 +0000793 if (!( t = PyTuple_New(2)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000794 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +0000795
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000796 PyTuple_SET_ITEM(t, 0, memo_len);
797 Py_INCREF(memo_len);
798 PyTuple_SET_ITEM(t, 1, ob);
799 Py_INCREF(ob);
800
801 if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)
802 goto finally;
803
804 if (!self->bin) {
805 c_str[0] = PUT;
806 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%d\n", p);
807 len = strlen(c_str);
808 }
809 else if (Pdata_Check(self->file)) {
810 if (write_other(self, NULL, 0) < 0) return -1;
811 PDATA_APPEND(self->file, memo_len, -1);
812 res=0; /* Job well done ;) */
813 goto finally;
814 }
815 else {
816 if (p >= 256) {
817 c_str[0] = LONG_BINPUT;
818 c_str[1] = (int)(p & 0xff);
819 c_str[2] = (int)((p >> 8) & 0xff);
820 c_str[3] = (int)((p >> 16) & 0xff);
821 c_str[4] = (int)((p >> 24) & 0xff);
822 len = 5;
823 }
824 else {
825 c_str[0] = BINPUT;
826 c_str[1] = p;
827 len = 2;
828 }
829 }
830
Tim Peters0bc93f52003-02-02 18:29:33 +0000831 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000832 goto finally;
833
834 res = 0;
835
836 finally:
837 Py_XDECREF(py_ob_id);
838 Py_XDECREF(memo_len);
839 Py_XDECREF(t);
840
841 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000842}
843
Guido van Rossumfdde96c1997-12-04 01:13:01 +0000844static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +0000845whichmodule(PyObject *global, PyObject *global_name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000846{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000847 Py_ssize_t i, j;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000848 PyObject *module = 0, *modules_dict = 0,
849 *global_name_attr = 0, *name = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000850
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000851 module = PyObject_GetAttrString(global, "__module__");
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000852 if (module)
853 return module;
854 if (PyErr_ExceptionMatches(PyExc_AttributeError))
855 PyErr_Clear();
856 else
857 return NULL;
Guido van Rossum45188231997-09-28 05:38:51 +0000858
Tim Peterscba30e22003-02-01 06:24:36 +0000859 if (!( modules_dict = PySys_GetObject("modules")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000860 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000861
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000862 i = 0;
863 while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {
Guido van Rossum142eeb81997-08-13 03:14:41 +0000864
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000865 if (PyObject_Compare(name, __main___str)==0) continue;
Tim Peters84e87f32001-03-17 04:50:51 +0000866
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000867 global_name_attr = PyObject_GetAttr(module, global_name);
868 if (!global_name_attr) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +0000869 if (PyErr_ExceptionMatches(PyExc_AttributeError))
870 PyErr_Clear();
871 else
872 return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000873 continue;
874 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000875
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000876 if (global_name_attr != global) {
877 Py_DECREF(global_name_attr);
878 continue;
879 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000880
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000881 Py_DECREF(global_name_attr);
Guido van Rossum60456fd1997-04-09 17:36:32 +0000882
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000883 break;
884 }
Guido van Rossum142eeb81997-08-13 03:14:41 +0000885
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000886 /* The following implements the rule in pickle.py added in 1.5
887 that used __main__ if no module is found. I don't actually
888 like this rule. jlf
889 */
890 if (!j) {
891 j=1;
892 name=__main___str;
893 }
Guido van Rossum60456fd1997-04-09 17:36:32 +0000894
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000895 Py_INCREF(name);
896 return name;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000897}
898
899
Guido van Rossum60456fd1997-04-09 17:36:32 +0000900static int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000901fast_save_enter(Picklerobject *self, PyObject *obj)
902{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000903 /* if fast_container < 0, we're doing an error exit. */
904 if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {
905 PyObject *key = NULL;
906 if (self->fast_memo == NULL) {
907 self->fast_memo = PyDict_New();
908 if (self->fast_memo == NULL) {
909 self->fast_container = -1;
910 return 0;
911 }
912 }
913 key = PyLong_FromVoidPtr(obj);
914 if (key == NULL)
915 return 0;
916 if (PyDict_GetItem(self->fast_memo, key)) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000917 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000918 PyErr_Format(PyExc_ValueError,
Tim Peters92c8bb32003-02-13 23:00:26 +0000919 "fast mode: can't pickle cyclic objects "
920 "including object type %s at %p",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000921 obj->ob_type->tp_name, obj);
922 self->fast_container = -1;
923 return 0;
924 }
925 if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000926 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000927 self->fast_container = -1;
928 return 0;
929 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000930 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000931 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000932 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000933}
934
Tim Peterscba30e22003-02-01 06:24:36 +0000935int
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000936fast_save_leave(Picklerobject *self, PyObject *obj)
937{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000938 if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {
939 PyObject *key = PyLong_FromVoidPtr(obj);
940 if (key == NULL)
941 return 0;
942 if (PyDict_DelItem(self->fast_memo, key) < 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +0000943 Py_DECREF(key);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000944 return 0;
945 }
Tim Peters4e52ca82002-12-07 02:43:28 +0000946 Py_DECREF(key);
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000947 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000948 return 1;
Jeremy Hylton499ab6a2001-10-15 21:37:58 +0000949}
950
951static int
Tim Peterscba30e22003-02-01 06:24:36 +0000952save_none(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000953{
954 static char none = NONE;
Tim Peters0bc93f52003-02-02 18:29:33 +0000955 if (self->write_func(self, &none, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000956 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000957
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000958 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000959}
960
Guido van Rossum77f6a652002-04-03 22:41:51 +0000961static int
Tim Peterscba30e22003-02-01 06:24:36 +0000962save_bool(Picklerobject *self, PyObject *args)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000963{
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000964 static const char *buf[2] = {FALSE, TRUE};
Guido van Rossume2763392002-04-05 19:30:08 +0000965 static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};
Guido van Rossumddefaf32007-01-14 03:31:43 +0000966 long l = args == Py_True;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000967
Tim Peters3c67d792003-02-02 17:59:11 +0000968 if (self->proto >= 2) {
969 char opcode = l ? NEWTRUE : NEWFALSE;
970 if (self->write_func(self, &opcode, 1) < 0)
971 return -1;
972 }
973 else if (self->write_func(self, buf[l], len[l]) < 0)
Guido van Rossum77f6a652002-04-03 22:41:51 +0000974 return -1;
Guido van Rossum77f6a652002-04-03 22:41:51 +0000975 return 0;
976}
Tim Peters84e87f32001-03-17 04:50:51 +0000977
Guido van Rossum60456fd1997-04-09 17:36:32 +0000978static int
Guido van Rossumddefaf32007-01-14 03:31:43 +0000979save_int(Picklerobject *self, long l)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000980{
981 char c_str[32];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000982 int len = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +0000983
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000984 if (!self->bin
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000985#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000986 || l > 0x7fffffffL
987 || l < -0x80000000L
Guido van Rossumde8d6d71997-05-13 18:00:44 +0000988#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000989 ) {
990 /* Text-mode pickle, or long too big to fit in the 4-byte
991 * signed BININT format: store as a string.
992 */
993 c_str[0] = INT;
994 PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);
Tim Peters0bc93f52003-02-02 18:29:33 +0000995 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +0000996 return -1;
997 }
998 else {
999 /* Binary pickle and l fits in a signed 4-byte int. */
1000 c_str[1] = (int)( l & 0xff);
1001 c_str[2] = (int)((l >> 8) & 0xff);
1002 c_str[3] = (int)((l >> 16) & 0xff);
1003 c_str[4] = (int)((l >> 24) & 0xff);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001004
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001005 if ((c_str[4] == 0) && (c_str[3] == 0)) {
1006 if (c_str[2] == 0) {
1007 c_str[0] = BININT1;
1008 len = 2;
1009 }
1010 else {
1011 c_str[0] = BININT2;
1012 len = 3;
1013 }
1014 }
1015 else {
1016 c_str[0] = BININT;
1017 len = 5;
1018 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001019
Tim Peters0bc93f52003-02-02 18:29:33 +00001020 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001021 return -1;
1022 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001023
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001024 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001025}
1026
1027
1028static int
Tim Peterscba30e22003-02-01 06:24:36 +00001029save_long(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001030{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001031 Py_ssize_t size;
Tim Petersee1a53c2003-02-02 02:57:53 +00001032 int res = -1;
1033 PyObject *repr = NULL;
Guido van Rossumddefaf32007-01-14 03:31:43 +00001034 int val = PyInt_AsLong(args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001035 static char l = LONG;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001036
Guido van Rossumddefaf32007-01-14 03:31:43 +00001037 if (val == -1 && PyErr_Occurred()) {
1038 /* out of range for int pickling */
1039 PyErr_Clear();
1040 }
1041 else
1042 return save_int(self, val);
1043
Tim Petersee1a53c2003-02-02 02:57:53 +00001044 if (self->proto >= 2) {
1045 /* Linear-time pickling. */
1046 size_t nbits;
1047 size_t nbytes;
1048 unsigned char *pdata;
1049 char c_str[5];
1050 int i;
1051 int sign = _PyLong_Sign(args);
1052
1053 if (sign == 0) {
1054 /* It's 0 -- an empty bytestring. */
1055 c_str[0] = LONG1;
1056 c_str[1] = 0;
1057 i = self->write_func(self, c_str, 2);
1058 if (i < 0) goto finally;
1059 res = 0;
1060 goto finally;
1061 }
1062 nbits = _PyLong_NumBits(args);
1063 if (nbits == (size_t)-1 && PyErr_Occurred())
1064 goto finally;
1065 /* How many bytes do we need? There are nbits >> 3 full
1066 * bytes of data, and nbits & 7 leftover bits. If there
1067 * are any leftover bits, then we clearly need another
1068 * byte. Wnat's not so obvious is that we *probably*
1069 * need another byte even if there aren't any leftovers:
1070 * the most-significant bit of the most-significant byte
1071 * acts like a sign bit, and it's usually got a sense
1072 * opposite of the one we need. The exception is longs
1073 * of the form -(2**(8*j-1)) for j > 0. Such a long is
1074 * its own 256's-complement, so has the right sign bit
1075 * even without the extra byte. That's a pain to check
1076 * for in advance, though, so we always grab an extra
1077 * byte at the start, and cut it back later if possible.
1078 */
1079 nbytes = (nbits >> 3) + 1;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001080 if (nbytes > INT_MAX) {
Tim Petersee1a53c2003-02-02 02:57:53 +00001081 PyErr_SetString(PyExc_OverflowError, "long too large "
1082 "to pickle");
1083 goto finally;
1084 }
1085 repr = PyString_FromStringAndSize(NULL, (int)nbytes);
1086 if (repr == NULL) goto finally;
1087 pdata = (unsigned char *)PyString_AS_STRING(repr);
1088 i = _PyLong_AsByteArray((PyLongObject *)args,
1089 pdata, nbytes,
1090 1 /* little endian */, 1 /* signed */);
1091 if (i < 0) goto finally;
1092 /* If the long is negative, this may be a byte more than
1093 * needed. This is so iff the MSB is all redundant sign
1094 * bits.
1095 */
1096 if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&
1097 (pdata[nbytes - 2] & 0x80) != 0)
1098 --nbytes;
1099
1100 if (nbytes < 256) {
1101 c_str[0] = LONG1;
1102 c_str[1] = (char)nbytes;
1103 size = 2;
1104 }
1105 else {
1106 c_str[0] = LONG4;
1107 size = (int)nbytes;
1108 for (i = 1; i < 5; i++) {
1109 c_str[i] = (char)(size & 0xff);
1110 size >>= 8;
1111 }
1112 size = 5;
1113 }
1114 i = self->write_func(self, c_str, size);
1115 if (i < 0) goto finally;
1116 i = self->write_func(self, (char *)pdata, (int)nbytes);
1117 if (i < 0) goto finally;
1118 res = 0;
1119 goto finally;
1120 }
1121
1122 /* proto < 2: write the repr and newline. This is quadratic-time
1123 * (in the number of digits), in both directions.
1124 */
Tim Peterscba30e22003-02-01 06:24:36 +00001125 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001126 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001127
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001128 if ((size = PyString_Size(repr)) < 0)
1129 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001130
Tim Peters0bc93f52003-02-02 18:29:33 +00001131 if (self->write_func(self, &l, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001132 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001133
Tim Peters0bc93f52003-02-02 18:29:33 +00001134 if (self->write_func(self,
1135 PyString_AS_STRING((PyStringObject *)repr),
1136 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001137 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001138
Tim Peters0bc93f52003-02-02 18:29:33 +00001139 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001140 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001141
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001142 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001143
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001144 finally:
1145 Py_XDECREF(repr);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001146 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001147}
1148
1149
1150static int
Tim Peterscba30e22003-02-01 06:24:36 +00001151save_float(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001152{
1153 double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001154
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001155 if (self->bin) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001156 char str[9];
Tim Peters9905b942003-03-20 20:53:32 +00001157 str[0] = BINFLOAT;
1158 if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001159 return -1;
Tim Peters0bc93f52003-02-02 18:29:33 +00001160 if (self->write_func(self, str, 9) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001161 return -1;
1162 }
1163 else {
1164 char c_str[250];
1165 c_str[0] = FLOAT;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001166 PyOS_ascii_formatd(c_str + 1, sizeof(c_str) - 2, "%.17g", x);
1167 /* Extend the formatted string with a newline character */
1168 strcat(c_str, "\n");
Guido van Rossum60456fd1997-04-09 17:36:32 +00001169
Tim Peters0bc93f52003-02-02 18:29:33 +00001170 if (self->write_func(self, c_str, strlen(c_str)) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001171 return -1;
1172 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001173
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001174 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001175}
1176
1177
1178static int
Tim Peterscba30e22003-02-01 06:24:36 +00001179save_string(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001180{
1181 int size, len;
1182 PyObject *repr=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001183
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001184 if ((size = PyString_Size(args)) < 0)
1185 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001186
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001187 if (!self->bin) {
1188 char *repr_str;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001190 static char string = STRING;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001191
Tim Peterscba30e22003-02-01 06:24:36 +00001192 if (!( repr = PyObject_Repr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001193 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001194
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001195 if ((len = PyString_Size(repr)) < 0)
1196 goto err;
1197 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001198
Tim Peters0bc93f52003-02-02 18:29:33 +00001199 if (self->write_func(self, &string, 1) < 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, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001203 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001204
Tim Peters0bc93f52003-02-02 18:29:33 +00001205 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001206 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001207
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001208 Py_XDECREF(repr);
1209 }
1210 else {
1211 int i;
1212 char c_str[5];
Guido van Rossum60456fd1997-04-09 17:36:32 +00001213
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001214 if ((size = PyString_Size(args)) < 0)
1215 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001216
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001217 if (size < 256) {
1218 c_str[0] = SHORT_BINSTRING;
1219 c_str[1] = size;
1220 len = 2;
1221 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001222 else if (size <= INT_MAX) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001223 c_str[0] = BINSTRING;
1224 for (i = 1; i < 5; i++)
1225 c_str[i] = (int)(size >> ((i - 1) * 8));
1226 len = 5;
1227 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001228 else
1229 return -1; /* string too large */
Guido van Rossum60456fd1997-04-09 17:36:32 +00001230
Tim Peters0bc93f52003-02-02 18:29:33 +00001231 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001232 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001234 if (size > 128 && Pdata_Check(self->file)) {
1235 if (write_other(self, NULL, 0) < 0) return -1;
1236 PDATA_APPEND(self->file, args, -1);
1237 }
1238 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001239 if (self->write_func(self,
1240 PyString_AS_STRING(
1241 (PyStringObject *)args),
1242 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001243 return -1;
1244 }
1245 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001247 if (doput)
1248 if (put(self, args) < 0)
1249 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001250
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001251 return 0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001252
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001253 err:
1254 Py_XDECREF(repr);
1255 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001256}
1257
1258
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001259/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates
1260 backslash and newline characters to \uXXXX escapes. */
1261static PyObject *
1262modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, int size)
1263{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001264 PyObject *repr;
1265 char *p;
1266 char *q;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001267
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001268 static const char *hexdigit = "0123456789ABCDEF";
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001269
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001270 repr = PyString_FromStringAndSize(NULL, 6 * size);
1271 if (repr == NULL)
1272 return NULL;
1273 if (size == 0)
1274 return repr;
1275
1276 p = q = PyString_AS_STRING(repr);
1277 while (size-- > 0) {
1278 Py_UNICODE ch = *s++;
1279 /* Map 16-bit characters to '\uxxxx' */
1280 if (ch >= 256 || ch == '\\' || ch == '\n') {
1281 *p++ = '\\';
1282 *p++ = 'u';
1283 *p++ = hexdigit[(ch >> 12) & 0xf];
1284 *p++ = hexdigit[(ch >> 8) & 0xf];
1285 *p++ = hexdigit[(ch >> 4) & 0xf];
1286 *p++ = hexdigit[ch & 15];
1287 }
1288 /* Copy everything else as-is */
1289 else
1290 *p++ = (char) ch;
1291 }
1292 *p = '\0';
Tim Peters5de98422002-04-27 18:44:32 +00001293 _PyString_Resize(&repr, p - q);
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001294 return repr;
Guido van Rossumfb10c3f2000-12-19 02:08:38 +00001295}
1296
1297
Guido van Rossum60456fd1997-04-09 17:36:32 +00001298static int
Tim Peterscba30e22003-02-01 06:24:36 +00001299save_unicode(Picklerobject *self, PyObject *args, int doput)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001300{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001301 Py_ssize_t size, len;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001302 PyObject *repr=0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001303
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001304 if (!PyUnicode_Check(args))
1305 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001306
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001307 if (!self->bin) {
1308 char *repr_str;
1309 static char string = UNICODE;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001311 repr = modified_EncodeRawUnicodeEscape(
1312 PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));
Tim Peterscba30e22003-02-01 06:24:36 +00001313 if (!repr)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001314 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001315
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001316 if ((len = PyString_Size(repr)) < 0)
1317 goto err;
1318 repr_str = PyString_AS_STRING((PyStringObject *)repr);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001319
Tim Peters0bc93f52003-02-02 18:29:33 +00001320 if (self->write_func(self, &string, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001321 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001322
Tim Peters0bc93f52003-02-02 18:29:33 +00001323 if (self->write_func(self, repr_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001324 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001325
Tim Peters0bc93f52003-02-02 18:29:33 +00001326 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001327 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001328
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001329 Py_XDECREF(repr);
1330 }
1331 else {
1332 int i;
1333 char c_str[5];
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001334
Tim Peterscba30e22003-02-01 06:24:36 +00001335 if (!( repr = PyUnicode_AsUTF8String(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001336 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001337
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001338 if ((size = PyString_Size(repr)) < 0)
1339 goto err;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001340 if (size > INT_MAX)
1341 return -1; /* string too large */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001342
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001343 c_str[0] = BINUNICODE;
1344 for (i = 1; i < 5; i++)
1345 c_str[i] = (int)(size >> ((i - 1) * 8));
1346 len = 5;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001347
Tim Peters0bc93f52003-02-02 18:29:33 +00001348 if (self->write_func(self, c_str, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001349 goto err;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001350
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001351 if (size > 128 && Pdata_Check(self->file)) {
1352 if (write_other(self, NULL, 0) < 0)
1353 goto err;
1354 PDATA_APPEND(self->file, repr, -1);
1355 }
1356 else {
Tim Peters0bc93f52003-02-02 18:29:33 +00001357 if (self->write_func(self, PyString_AS_STRING(repr),
1358 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001359 goto err;
1360 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001361
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001362 Py_DECREF(repr);
1363 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001364
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001365 if (doput)
1366 if (put(self, args) < 0)
1367 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001368
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001369 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001370
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001371 err:
1372 Py_XDECREF(repr);
1373 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001374}
1375
Tim Peters1d63c9f2003-02-02 20:29:39 +00001376/* A helper for save_tuple. Push the len elements in tuple t on the stack. */
1377static int
Tim Peters67920142003-02-05 03:46:17 +00001378store_tuple_elements(Picklerobject *self, PyObject *t, int len)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001379{
1380 int i;
1381 int res = -1; /* guilty until proved innocent */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001382
Tim Peters1d63c9f2003-02-02 20:29:39 +00001383 assert(PyTuple_Size(t) == len);
1384
1385 for (i = 0; i < len; i++) {
1386 PyObject *element = PyTuple_GET_ITEM(t, i);
1387
1388 if (element == NULL)
1389 goto finally;
1390 if (save(self, element, 0) < 0)
1391 goto finally;
1392 }
1393 res = 0;
1394
1395 finally:
1396 return res;
1397}
1398
1399/* Tuples are ubiquitous in the pickle protocols, so many techniques are
1400 * used across protocols to minimize the space needed to pickle them.
Tim Peters67920142003-02-05 03:46:17 +00001401 * Tuples are also the only builtin immutable type that can be recursive
Tim Peters1d63c9f2003-02-02 20:29:39 +00001402 * (a tuple can be reached from itself), and that requires some subtle
1403 * magic so that it works in all cases. IOW, this is a long routine.
1404 */
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00001405static int
Tim Peterscba30e22003-02-01 06:24:36 +00001406save_tuple(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001407{
Tim Peters1d63c9f2003-02-02 20:29:39 +00001408 PyObject *py_tuple_id = NULL;
1409 int len, i;
1410 int res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001411
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001412 static char tuple = TUPLE;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001413 static char pop = POP;
1414 static char pop_mark = POP_MARK;
1415 static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};
Guido van Rossum60456fd1997-04-09 17:36:32 +00001416
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001417 if ((len = PyTuple_Size(args)) < 0)
1418 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001419
Tim Peters1d63c9f2003-02-02 20:29:39 +00001420 if (len == 0) {
1421 char c_str[2];
Tim Peters84e87f32001-03-17 04:50:51 +00001422
Tim Peters1d63c9f2003-02-02 20:29:39 +00001423 if (self->proto) {
1424 c_str[0] = EMPTY_TUPLE;
1425 len = 1;
1426 }
1427 else {
1428 c_str[0] = MARK;
1429 c_str[1] = TUPLE;
1430 len = 2;
1431 }
1432 if (self->write_func(self, c_str, len) >= 0)
1433 res = 0;
1434 /* Don't memoize an empty tuple. */
1435 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001436 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001437
Tim Peters1d63c9f2003-02-02 20:29:39 +00001438 /* A non-empty tuple. */
1439
1440 /* id(tuple) isn't in the memo now. If it shows up there after
1441 * saving the tuple elements, the tuple must be recursive, in
1442 * which case we'll pop everything we put on the stack, and fetch
1443 * its value from the memo.
1444 */
1445 py_tuple_id = PyLong_FromVoidPtr(args);
1446 if (py_tuple_id == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001447 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001448
Tim Peters1d63c9f2003-02-02 20:29:39 +00001449 if (len <= 3 && self->proto >= 2) {
1450 /* Use TUPLE{1,2,3} opcodes. */
Tim Peters67920142003-02-05 03:46:17 +00001451 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001452 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001453 if (PyDict_GetItem(self->memo, py_tuple_id)) {
Tim Peters1d63c9f2003-02-02 20:29:39 +00001454 /* pop the len elements */
1455 for (i = 0; i < len; ++i)
1456 if (self->write_func(self, &pop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001457 goto finally;
Tim Peters1d63c9f2003-02-02 20:29:39 +00001458 /* fetch from memo */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001459 if (get(self, py_tuple_id) < 0)
1460 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001461 res = 0;
1462 goto finally;
1463 }
Tim Peters1d63c9f2003-02-02 20:29:39 +00001464 /* Not recursive. */
1465 if (self->write_func(self, len2opcode + len, 1) < 0)
1466 goto finally;
1467 goto memoize;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001468 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001469
Tim Peters1d63c9f2003-02-02 20:29:39 +00001470 /* proto < 2 and len > 0, or proto >= 2 and len > 3.
1471 * Generate MARK elt1 elt2 ... TUPLE
1472 */
1473 if (self->write_func(self, &MARKv, 1) < 0)
1474 goto finally;
1475
Tim Peters67920142003-02-05 03:46:17 +00001476 if (store_tuple_elements(self, args, len) < 0)
Tim Peters1d63c9f2003-02-02 20:29:39 +00001477 goto finally;
1478
1479 if (PyDict_GetItem(self->memo, py_tuple_id)) {
1480 /* pop the stack stuff we pushed */
1481 if (self->bin) {
1482 if (self->write_func(self, &pop_mark, 1) < 0)
1483 goto finally;
1484 }
1485 else {
1486 /* Note that we pop one more than len, to remove
1487 * the MARK too.
1488 */
1489 for (i = 0; i <= len; i++)
1490 if (self->write_func(self, &pop, 1) < 0)
1491 goto finally;
1492 }
1493 /* fetch from memo */
1494 if (get(self, py_tuple_id) >= 0)
1495 res = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001496 goto finally;
1497 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001498
Tim Peters1d63c9f2003-02-02 20:29:39 +00001499 /* Not recursive. */
1500 if (self->write_func(self, &tuple, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001501 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001502
Tim Peters1d63c9f2003-02-02 20:29:39 +00001503 memoize:
1504 if (put(self, args) >= 0)
1505 res = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001506
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001507 finally:
1508 Py_XDECREF(py_tuple_id);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001509 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001510}
1511
Tim Peters1092d642003-02-11 21:06:20 +00001512/* iter is an iterator giving items, and we batch up chunks of
1513 * MARK item item ... item APPENDS
1514 * opcode sequences. Calling code should have arranged to first create an
1515 * empty list, or list-like object, for the APPENDS to operate on.
1516 * Returns 0 on success, <0 on error.
1517 */
1518static int
1519batch_list(Picklerobject *self, PyObject *iter)
1520{
1521 PyObject *obj;
1522 PyObject *slice[BATCHSIZE];
1523 int i, n;
1524
1525 static char append = APPEND;
1526 static char appends = APPENDS;
1527
1528 assert(iter != NULL);
1529
1530 if (self->proto == 0) {
1531 /* APPENDS isn't available; do one at a time. */
1532 for (;;) {
1533 obj = PyIter_Next(iter);
1534 if (obj == NULL) {
1535 if (PyErr_Occurred())
1536 return -1;
1537 break;
1538 }
1539 i = save(self, obj, 0);
1540 Py_DECREF(obj);
1541 if (i < 0)
1542 return -1;
1543 if (self->write_func(self, &append, 1) < 0)
1544 return -1;
Tim Peters1092d642003-02-11 21:06:20 +00001545 }
1546 return 0;
1547 }
1548
1549 /* proto > 0: write in batches of BATCHSIZE. */
1550 do {
1551 /* Get next group of (no more than) BATCHSIZE elements. */
1552 for (n = 0; n < BATCHSIZE; ++n) {
1553 obj = PyIter_Next(iter);
1554 if (obj == NULL) {
1555 if (PyErr_Occurred())
1556 goto BatchFailed;
1557 break;
1558 }
1559 slice[n] = obj;
1560 }
1561
1562 if (n > 1) {
1563 /* Pump out MARK, slice[0:n], APPENDS. */
1564 if (self->write_func(self, &MARKv, 1) < 0)
1565 goto BatchFailed;
1566 for (i = 0; i < n; ++i) {
1567 if (save(self, slice[i], 0) < 0)
1568 goto BatchFailed;
1569 }
1570 if (self->write_func(self, &appends, 1) < 0)
1571 goto BatchFailed;
1572 }
1573 else if (n == 1) {
1574 if (save(self, slice[0], 0) < 0)
1575 goto BatchFailed;
1576 if (self->write_func(self, &append, 1) < 0)
1577 goto BatchFailed;
1578 }
1579
1580 for (i = 0; i < n; ++i) {
1581 Py_DECREF(slice[i]);
1582 }
Tim Peters90975f12003-02-12 05:28:58 +00001583 } while (n == BATCHSIZE);
Tim Peters1092d642003-02-11 21:06:20 +00001584 return 0;
1585
1586BatchFailed:
1587 while (--n >= 0) {
1588 Py_DECREF(slice[n]);
1589 }
1590 return -1;
1591}
1592
Guido van Rossum60456fd1997-04-09 17:36:32 +00001593static int
Tim Peterscba30e22003-02-01 06:24:36 +00001594save_list(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001595{
Tim Peters1092d642003-02-11 21:06:20 +00001596 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001597 char s[3];
Tim Peters1092d642003-02-11 21:06:20 +00001598 int len;
1599 PyObject *iter;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001600
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001601 if (self->fast && !fast_save_enter(self, args))
1602 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001603
Tim Peters1092d642003-02-11 21:06:20 +00001604 /* Create an empty list. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001605 if (self->bin) {
1606 s[0] = EMPTY_LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001607 len = 1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001608 }
1609 else {
1610 s[0] = MARK;
1611 s[1] = LIST;
Tim Peters1092d642003-02-11 21:06:20 +00001612 len = 2;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001613 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00001614
Tim Peters1092d642003-02-11 21:06:20 +00001615 if (self->write_func(self, s, len) < 0)
1616 goto finally;
1617
1618 /* Get list length, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001619 if ((len = PyList_Size(args)) < 0)
1620 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001621
Tim Peters1092d642003-02-11 21:06:20 +00001622 /* Memoize. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001623 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001624 if (put(self, args) >= 0)
1625 res = 0;
1626 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001627 }
Tim Peters90975f12003-02-12 05:28:58 +00001628 if (put2(self, args) < 0)
1629 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001630
Tim Peters1092d642003-02-11 21:06:20 +00001631 /* Materialize the list elements. */
1632 iter = PyObject_GetIter(args);
1633 if (iter == NULL)
1634 goto finally;
1635 res = batch_list(self, iter);
1636 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001637
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001638 finally:
1639 if (self->fast && !fast_save_leave(self, args))
1640 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001641
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001642 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001643}
1644
1645
Tim Peters42f08ac2003-02-11 22:43:24 +00001646/* iter is an iterator giving (key, value) pairs, and we batch up chunks of
1647 * MARK key value ... key value SETITEMS
1648 * opcode sequences. Calling code should have arranged to first create an
1649 * empty dict, or dict-like object, for the SETITEMS to operate on.
1650 * Returns 0 on success, <0 on error.
1651 *
1652 * This is very much like batch_list(). The difference between saving
1653 * elements directly, and picking apart two-tuples, is so long-winded at
1654 * the C level, though, that attempts to combine these routines were too
1655 * ugly to bear.
1656 */
1657static int
1658batch_dict(Picklerobject *self, PyObject *iter)
1659{
1660 PyObject *p;
1661 PyObject *slice[BATCHSIZE];
1662 int i, n;
1663
1664 static char setitem = SETITEM;
1665 static char setitems = SETITEMS;
1666
1667 assert(iter != NULL);
1668
1669 if (self->proto == 0) {
1670 /* SETITEMS isn't available; do one at a time. */
1671 for (;;) {
1672 p = PyIter_Next(iter);
1673 if (p == NULL) {
1674 if (PyErr_Occurred())
1675 return -1;
1676 break;
1677 }
1678 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1679 PyErr_SetString(PyExc_TypeError, "dict items "
1680 "iterator must return 2-tuples");
1681 return -1;
1682 }
1683 i = save(self, PyTuple_GET_ITEM(p, 0), 0);
1684 if (i >= 0)
1685 i = save(self, PyTuple_GET_ITEM(p, 1), 0);
1686 Py_DECREF(p);
1687 if (i < 0)
1688 return -1;
1689 if (self->write_func(self, &setitem, 1) < 0)
1690 return -1;
Tim Peters42f08ac2003-02-11 22:43:24 +00001691 }
1692 return 0;
1693 }
1694
1695 /* proto > 0: write in batches of BATCHSIZE. */
1696 do {
1697 /* Get next group of (no more than) BATCHSIZE elements. */
1698 for (n = 0; n < BATCHSIZE; ++n) {
1699 p = PyIter_Next(iter);
1700 if (p == NULL) {
1701 if (PyErr_Occurred())
1702 goto BatchFailed;
1703 break;
1704 }
1705 if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {
1706 PyErr_SetString(PyExc_TypeError, "dict items "
1707 "iterator must return 2-tuples");
1708 goto BatchFailed;
1709 }
1710 slice[n] = p;
1711 }
1712
1713 if (n > 1) {
1714 /* Pump out MARK, slice[0:n], SETITEMS. */
1715 if (self->write_func(self, &MARKv, 1) < 0)
1716 goto BatchFailed;
1717 for (i = 0; i < n; ++i) {
1718 p = slice[i];
1719 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1720 goto BatchFailed;
1721 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1722 goto BatchFailed;
1723 }
1724 if (self->write_func(self, &setitems, 1) < 0)
1725 goto BatchFailed;
1726 }
1727 else if (n == 1) {
1728 p = slice[0];
1729 if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)
1730 goto BatchFailed;
1731 if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)
1732 goto BatchFailed;
1733 if (self->write_func(self, &setitem, 1) < 0)
1734 goto BatchFailed;
1735 }
1736
1737 for (i = 0; i < n; ++i) {
1738 Py_DECREF(slice[i]);
1739 }
Tim Peters90975f12003-02-12 05:28:58 +00001740 } while (n == BATCHSIZE);
Tim Peters42f08ac2003-02-11 22:43:24 +00001741 return 0;
1742
1743BatchFailed:
1744 while (--n >= 0) {
1745 Py_DECREF(slice[n]);
1746 }
1747 return -1;
1748}
1749
Guido van Rossum60456fd1997-04-09 17:36:32 +00001750static int
Tim Peterscba30e22003-02-01 06:24:36 +00001751save_dict(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001752{
Tim Peters42f08ac2003-02-11 22:43:24 +00001753 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001754 char s[3];
Tim Peters42f08ac2003-02-11 22:43:24 +00001755 int len;
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001756 PyObject *items, *iter;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001758 if (self->fast && !fast_save_enter(self, args))
1759 goto finally;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00001760
Tim Peters42f08ac2003-02-11 22:43:24 +00001761 /* Create an empty dict. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001762 if (self->bin) {
1763 s[0] = EMPTY_DICT;
1764 len = 1;
1765 }
1766 else {
1767 s[0] = MARK;
1768 s[1] = DICT;
1769 len = 2;
1770 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001771
Tim Peters0bc93f52003-02-02 18:29:33 +00001772 if (self->write_func(self, s, len) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001773 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001774
Tim Peters42f08ac2003-02-11 22:43:24 +00001775 /* Get dict size, and bow out early if empty. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001776 if ((len = PyDict_Size(args)) < 0)
1777 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001778
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001779 if (len == 0) {
Tim Peters90975f12003-02-12 05:28:58 +00001780 if (put(self, args) >= 0)
1781 res = 0;
1782 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001783 }
Tim Peters90975f12003-02-12 05:28:58 +00001784 if (put2(self, args) < 0)
1785 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001786
Tim Peters42f08ac2003-02-11 22:43:24 +00001787 /* Materialize the dict items. */
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001788 items = PyObject_CallMethod(args, "items", "()");
1789 if (items == NULL)
1790 goto finally;
1791 iter = PyObject_GetIter(items);
1792 Py_DECREF(items);
Tim Peters42f08ac2003-02-11 22:43:24 +00001793 if (iter == NULL)
1794 goto finally;
1795 res = batch_dict(self, iter);
1796 Py_DECREF(iter);
Guido van Rossum60456fd1997-04-09 17:36:32 +00001797
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001798 finally:
1799 if (self->fast && !fast_save_leave(self, args))
1800 res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00001801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001802 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001803}
1804
1805
Guido van Rossum60456fd1997-04-09 17:36:32 +00001806static int
Tim Peterscba30e22003-02-01 06:24:36 +00001807save_global(Picklerobject *self, PyObject *args, PyObject *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001808{
Jeremy Hylton9ee91f12002-07-11 22:02:33 +00001809 PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001810 char *name_str, *module_str;
1811 int module_size, name_size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001813 static char global = GLOBAL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001814
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001815 if (name) {
1816 global_name = name;
1817 Py_INCREF(global_name);
1818 }
1819 else {
Tim Peterscba30e22003-02-01 06:24:36 +00001820 if (!( global_name = PyObject_GetAttr(args, __name___str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001821 goto finally;
1822 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001823
Tim Peterscba30e22003-02-01 06:24:36 +00001824 if (!( module = whichmodule(args, global_name)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001825 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001827 if ((module_size = PyString_Size(module)) < 0 ||
1828 (name_size = PyString_Size(global_name)) < 0)
1829 goto finally;
Guido van Rossum053b8df1998-11-25 16:18:00 +00001830
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001831 module_str = PyString_AS_STRING((PyStringObject *)module);
1832 name_str = PyString_AS_STRING((PyStringObject *)global_name);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001833
Guido van Rossum75bfd052002-12-24 18:10:07 +00001834 /* XXX This can be doing a relative import. Clearly it shouldn't,
1835 but I don't know how to stop it. :-( */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001836 mod = PyImport_ImportModule(module_str);
1837 if (mod == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001838 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001839 "Can't pickle %s: import of module %s "
1840 "failed",
1841 "OS", args, module);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001842 goto finally;
1843 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001844 klass = PyObject_GetAttrString(mod, name_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001845 if (klass == NULL) {
1846 cPickle_ErrFormat(PicklingError,
Tim Petersb9ce7cd2003-02-18 20:50:45 +00001847 "Can't pickle %s: attribute lookup %s.%s "
1848 "failed",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001849 "OSS", args, module, global_name);
1850 goto finally;
1851 }
1852 if (klass != args) {
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001853 Py_DECREF(klass);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001854 cPickle_ErrFormat(PicklingError,
Tim Peters731098b2003-02-04 20:56:09 +00001855 "Can't pickle %s: it's not the same object "
1856 "as %s.%s",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001857 "OSS", args, module, global_name);
1858 goto finally;
1859 }
Jeremy Hylton0e1f7a82002-07-11 22:01:40 +00001860 Py_DECREF(klass);
Guido van Rossuma92d16a2001-08-18 21:22:07 +00001861
Tim Peters731098b2003-02-04 20:56:09 +00001862 if (self->proto >= 2) {
1863 /* See whether this is in the extension registry, and if
1864 * so generate an EXT opcode.
1865 */
1866 PyObject *py_code; /* extension code as Python object */
Tim Peters3e667d52003-02-04 21:47:44 +00001867 long code; /* extension code as C value */
Tim Peters731098b2003-02-04 20:56:09 +00001868 char c_str[5];
1869 int n;
1870
1871 PyTuple_SET_ITEM(two_tuple, 0, module);
1872 PyTuple_SET_ITEM(two_tuple, 1, global_name);
1873 py_code = PyDict_GetItem(extension_registry, two_tuple);
1874 if (py_code == NULL)
1875 goto gen_global; /* not registered */
1876
1877 /* Verify py_code has the right type and value. */
1878 if (!PyInt_Check(py_code)) {
1879 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
Tim Peters6288e232003-02-05 03:53:10 +00001880 "extension code %s isn't an integer",
Tim Peters731098b2003-02-04 20:56:09 +00001881 "OO", args, py_code);
1882 goto finally;
1883 }
1884 code = PyInt_AS_LONG(py_code);
1885 if (code <= 0 || code > 0x7fffffffL) {
1886 cPickle_ErrFormat(PicklingError, "Can't pickle %s: "
1887 "extension code %ld is out of range",
1888 "Ol", args, code);
1889 goto finally;
1890 }
1891
1892 /* Generate an EXT opcode. */
1893 if (code <= 0xff) {
1894 c_str[0] = EXT1;
1895 c_str[1] = (char)code;
1896 n = 2;
1897 }
1898 else if (code <= 0xffff) {
1899 c_str[0] = EXT2;
1900 c_str[1] = (char)(code & 0xff);
1901 c_str[2] = (char)((code >> 8) & 0xff);
1902 n = 3;
1903 }
1904 else {
1905 c_str[0] = EXT4;
1906 c_str[1] = (char)(code & 0xff);
1907 c_str[2] = (char)((code >> 8) & 0xff);
1908 c_str[3] = (char)((code >> 16) & 0xff);
1909 c_str[4] = (char)((code >> 24) & 0xff);
1910 n = 5;
1911 }
1912
1913 if (self->write_func(self, c_str, n) >= 0)
1914 res = 0;
1915 goto finally; /* and don't memoize */
1916 }
1917
1918 gen_global:
Tim Peters0bc93f52003-02-02 18:29:33 +00001919 if (self->write_func(self, &global, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001920 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001921
Tim Peters0bc93f52003-02-02 18:29:33 +00001922 if (self->write_func(self, module_str, module_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001923 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001924
Tim Peters0bc93f52003-02-02 18:29:33 +00001925 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001926 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001927
Tim Peters0bc93f52003-02-02 18:29:33 +00001928 if (self->write_func(self, name_str, name_size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001929 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001930
Tim Peters0bc93f52003-02-02 18:29:33 +00001931 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001932 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001933
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001934 if (put(self, args) < 0)
1935 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001936
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001937 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001938
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001939 finally:
1940 Py_XDECREF(module);
1941 Py_XDECREF(global_name);
1942 Py_XDECREF(mod);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001943
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001944 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001945}
1946
Guido van Rossum60456fd1997-04-09 17:36:32 +00001947static int
Tim Peterscba30e22003-02-01 06:24:36 +00001948save_pers(Picklerobject *self, PyObject *args, PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001949{
1950 PyObject *pid = 0;
1951 int size, res = -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001952
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001953 static char persid = PERSID, binpersid = BINPERSID;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001954
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001955 Py_INCREF(args);
1956 ARG_TUP(self, args);
1957 if (self->arg) {
1958 pid = PyObject_Call(f, self->arg, NULL);
1959 FREE_ARG_TUP(self);
1960 }
1961 if (! pid) return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001963 if (pid != Py_None) {
1964 if (!self->bin) {
1965 if (!PyString_Check(pid)) {
1966 PyErr_SetString(PicklingError,
1967 "persistent id must be string");
1968 goto finally;
1969 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001970
Tim Peters0bc93f52003-02-02 18:29:33 +00001971 if (self->write_func(self, &persid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001972 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001973
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001974 if ((size = PyString_Size(pid)) < 0)
1975 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001976
Tim Peters0bc93f52003-02-02 18:29:33 +00001977 if (self->write_func(self,
1978 PyString_AS_STRING(
1979 (PyStringObject *)pid),
1980 size) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001981 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001982
Tim Peters0bc93f52003-02-02 18:29:33 +00001983 if (self->write_func(self, "\n", 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001984 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00001985
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001986 res = 1;
1987 goto finally;
1988 }
1989 else if (save(self, pid, 1) >= 0) {
Tim Peters0bc93f52003-02-02 18:29:33 +00001990 if (self->write_func(self, &binpersid, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001991 res = -1;
1992 else
1993 res = 1;
1994 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001995
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001996 goto finally;
1997 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00001998
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00001999 res = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002001 finally:
2002 Py_XDECREF(pid);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002004 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002005}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002006
Tim Peters71fcda52003-02-14 23:05:28 +00002007/* We're saving ob, and args is the 2-thru-5 tuple returned by the
2008 * appropriate __reduce__ method for ob.
2009 */
Tim Peters84e87f32001-03-17 04:50:51 +00002010static int
Tim Peters71fcda52003-02-14 23:05:28 +00002011save_reduce(Picklerobject *self, PyObject *args, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002012{
Tim Peters71fcda52003-02-14 23:05:28 +00002013 PyObject *callable;
2014 PyObject *argtup;
2015 PyObject *state = NULL;
2016 PyObject *listitems = NULL;
2017 PyObject *dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002018
Tim Peters71fcda52003-02-14 23:05:28 +00002019 int use_newobj = self->proto >= 2;
2020
2021 static char reduce = REDUCE;
2022 static char build = BUILD;
2023 static char newobj = NEWOBJ;
2024
2025 if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,
2026 &callable,
2027 &argtup,
2028 &state,
2029 &listitems,
2030 &dictitems))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002031 return -1;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002032
Raymond Hettingera6b45cc2004-12-07 07:05:57 +00002033 if (!PyTuple_Check(argtup)) {
2034 PyErr_SetString(PicklingError,
2035 "args from reduce() should be a tuple");
2036 return -1;
2037 }
2038
Tim Peters71fcda52003-02-14 23:05:28 +00002039 if (state == Py_None)
2040 state = NULL;
2041 if (listitems == Py_None)
2042 listitems = NULL;
2043 if (dictitems == Py_None)
2044 dictitems = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002045
Tim Peters71fcda52003-02-14 23:05:28 +00002046 /* Protocol 2 special case: if callable's name is __newobj__, use
2047 * NEWOBJ. This consumes a lot of code.
2048 */
2049 if (use_newobj) {
2050 PyObject *temp = PyObject_GetAttr(callable, __name___str);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002051
Tim Peters71fcda52003-02-14 23:05:28 +00002052 if (temp == NULL) {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002053 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2054 PyErr_Clear();
2055 else
2056 return -1;
Tim Peters71fcda52003-02-14 23:05:28 +00002057 use_newobj = 0;
2058 }
2059 else {
2060 use_newobj = PyString_Check(temp) &&
2061 strcmp(PyString_AS_STRING(temp),
2062 "__newobj__") == 0;
2063 Py_DECREF(temp);
2064 }
2065 }
2066 if (use_newobj) {
2067 PyObject *cls;
2068 PyObject *newargtup;
2069 int n, i;
2070
2071 /* Sanity checks. */
2072 n = PyTuple_Size(argtup);
2073 if (n < 1) {
2074 PyErr_SetString(PicklingError, "__newobj__ arglist "
2075 "is empty");
2076 return -1;
2077 }
2078
2079 cls = PyTuple_GET_ITEM(argtup, 0);
2080 if (! PyObject_HasAttrString(cls, "__new__")) {
2081 PyErr_SetString(PicklingError, "args[0] from "
2082 "__newobj__ args has no __new__");
2083 return -1;
2084 }
2085
2086 /* XXX How could ob be NULL? */
2087 if (ob != NULL) {
2088 PyObject *ob_dot_class;
2089
2090 ob_dot_class = PyObject_GetAttr(ob, __class___str);
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002091 if (ob_dot_class == NULL) {
2092 if (PyErr_ExceptionMatches(
2093 PyExc_AttributeError))
2094 PyErr_Clear();
2095 else
2096 return -1;
2097 }
Tim Peters71fcda52003-02-14 23:05:28 +00002098 i = ob_dot_class != cls; /* true iff a problem */
2099 Py_XDECREF(ob_dot_class);
2100 if (i) {
2101 PyErr_SetString(PicklingError, "args[0] from "
2102 "__newobj__ args has the wrong class");
2103 return -1;
2104 }
2105 }
2106
2107 /* Save the class and its __new__ arguments. */
2108 if (save(self, cls, 0) < 0)
2109 return -1;
2110
2111 newargtup = PyTuple_New(n-1); /* argtup[1:] */
2112 if (newargtup == NULL)
2113 return -1;
2114 for (i = 1; i < n; ++i) {
2115 PyObject *temp = PyTuple_GET_ITEM(argtup, i);
2116 Py_INCREF(temp);
2117 PyTuple_SET_ITEM(newargtup, i-1, temp);
2118 }
2119 i = save(self, newargtup, 0) < 0;
2120 Py_DECREF(newargtup);
2121 if (i < 0)
2122 return -1;
2123
2124 /* Add NEWOBJ opcode. */
2125 if (self->write_func(self, &newobj, 1) < 0)
2126 return -1;
2127 }
2128 else {
2129 /* Not using NEWOBJ. */
2130 if (save(self, callable, 0) < 0 ||
2131 save(self, argtup, 0) < 0 ||
2132 self->write_func(self, &reduce, 1) < 0)
2133 return -1;
2134 }
2135
2136 /* Memoize. */
2137 /* XXX How can ob be NULL? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002138 if (ob != NULL) {
2139 if (state && !PyDict_Check(state)) {
2140 if (put2(self, ob) < 0)
2141 return -1;
2142 }
Tim Peters71fcda52003-02-14 23:05:28 +00002143 else if (put(self, ob) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002144 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002145 }
Tim Peters84e87f32001-03-17 04:50:51 +00002146
Guido van Rossum60456fd1997-04-09 17:36:32 +00002147
Tim Peters71fcda52003-02-14 23:05:28 +00002148 if (listitems && batch_list(self, listitems) < 0)
2149 return -1;
2150
2151 if (dictitems && batch_dict(self, dictitems) < 0)
2152 return -1;
2153
2154 if (state) {
2155 if (save(self, state, 0) < 0 ||
2156 self->write_func(self, &build, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002157 return -1;
2158 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002159
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002160 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002161}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002162
Guido van Rossum60456fd1997-04-09 17:36:32 +00002163static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00002164save(Picklerobject *self, PyObject *args, int pers_save)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002165{
2166 PyTypeObject *type;
Tim Peters71fcda52003-02-14 23:05:28 +00002167 PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;
2168 PyObject *arg_tup;
2169 int res = -1;
2170 int tmp, size;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002171
Martin v. Löwis5a395302002-08-04 08:20:23 +00002172 if (self->nesting++ > Py_GetRecursionLimit()){
2173 PyErr_SetString(PyExc_RuntimeError,
2174 "maximum recursion depth exceeded");
2175 goto finally;
2176 }
2177
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002178 if (!pers_save && self->pers_func) {
2179 if ((tmp = save_pers(self, args, self->pers_func)) != 0) {
2180 res = tmp;
2181 goto finally;
2182 }
2183 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002184
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002185 if (args == Py_None) {
2186 res = save_none(self, args);
2187 goto finally;
2188 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002189
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002190 type = args->ob_type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002191
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002192 switch (type->tp_name[0]) {
Guido van Rossum77f6a652002-04-03 22:41:51 +00002193 case 'b':
2194 if (args == Py_False || args == Py_True) {
2195 res = save_bool(self, args);
2196 goto finally;
2197 }
2198 break;
Guido van Rossum52d01782007-01-14 04:02:16 +00002199 case 'i':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002200 if (type == &PyLong_Type) {
2201 res = save_long(self, args);
2202 goto finally;
2203 }
2204 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002205
Guido van Rossum60456fd1997-04-09 17:36:32 +00002206 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002207 if (type == &PyFloat_Type) {
2208 res = save_float(self, args);
2209 goto finally;
2210 }
2211 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002212
Guido van Rossum60456fd1997-04-09 17:36:32 +00002213 case 't':
Tim Peters1d63c9f2003-02-02 20:29:39 +00002214 if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {
2215 res = save_tuple(self, args);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002216 goto finally;
2217 }
2218 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002219
Guido van Rossum60456fd1997-04-09 17:36:32 +00002220 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002221 if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {
2222 res = save_string(self, args, 0);
2223 goto finally;
2224 }
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002225
2226 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002227 if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {
2228 res = save_unicode(self, args, 0);
2229 goto finally;
2230 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002231 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002232
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002233 if (args->ob_refcnt > 1) {
Tim Peterscba30e22003-02-01 06:24:36 +00002234 if (!( py_ob_id = PyLong_FromVoidPtr(args)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002235 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002236
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002237 if (PyDict_GetItem(self->memo, py_ob_id)) {
2238 if (get(self, py_ob_id) < 0)
2239 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002240
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002241 res = 0;
2242 goto finally;
2243 }
2244 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002245
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002246 switch (type->tp_name[0]) {
Guido van Rossum60456fd1997-04-09 17:36:32 +00002247 case 's':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002248 if (type == &PyString_Type) {
2249 res = save_string(self, args, 1);
2250 goto finally;
2251 }
2252 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002253
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002254 case 'u':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002255 if (type == &PyUnicode_Type) {
2256 res = save_unicode(self, args, 1);
2257 goto finally;
2258 }
2259 break;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00002260
Guido van Rossum60456fd1997-04-09 17:36:32 +00002261 case 't':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002262 if (type == &PyTuple_Type) {
2263 res = save_tuple(self, args);
2264 goto finally;
2265 }
2266 if (type == &PyType_Type) {
2267 res = save_global(self, args, NULL);
2268 goto finally;
2269 }
2270 break;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002271
Guido van Rossum60456fd1997-04-09 17:36:32 +00002272 case 'l':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002273 if (type == &PyList_Type) {
2274 res = save_list(self, args);
2275 goto finally;
2276 }
2277 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002278
2279 case 'd':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002280 if (type == &PyDict_Type) {
2281 res = save_dict(self, args);
2282 goto finally;
2283 }
2284 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002285
Guido van Rossum512ab9f2006-08-17 22:28:49 +00002286 case 'i':
2287 break;
2288
2289 case 'c':
2290 break;
2291
Guido van Rossum60456fd1997-04-09 17:36:32 +00002292 case 'f':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002293 if (type == &PyFunction_Type) {
2294 res = save_global(self, args, NULL);
Christian Tismer2460c622004-02-26 16:21:45 +00002295 if (res && PyErr_ExceptionMatches(PickleError)) {
2296 /* fall back to reduce */
2297 PyErr_Clear();
2298 break;
2299 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002300 goto finally;
2301 }
2302 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002303
2304 case 'b':
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002305 if (type == &PyCFunction_Type) {
2306 res = save_global(self, args, NULL);
2307 goto finally;
2308 }
2309 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002310
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002311 if (!pers_save && self->inst_pers_func) {
2312 if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {
2313 res = tmp;
2314 goto finally;
2315 }
2316 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002317
Jeremy Hylton39c61162002-07-16 19:47:43 +00002318 if (PyType_IsSubtype(type, &PyType_Type)) {
2319 res = save_global(self, args, NULL);
2320 goto finally;
2321 }
2322
Guido van Rossumb289b872003-02-19 01:45:13 +00002323 /* Get a reduction callable, and call it. This may come from
2324 * copy_reg.dispatch_table, the object's __reduce_ex__ method,
2325 * or the object's __reduce__ method.
Tim Peters71fcda52003-02-14 23:05:28 +00002326 */
Tim Peters5aa3da62003-02-13 21:03:57 +00002327 __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);
2328 if (__reduce__ != NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002329 Py_INCREF(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00002330 Py_INCREF(args);
2331 ARG_TUP(self, args);
2332 if (self->arg) {
2333 t = PyObject_Call(__reduce__, self->arg, NULL);
2334 FREE_ARG_TUP(self);
2335 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002336 }
2337 else {
Guido van Rossumb289b872003-02-19 01:45:13 +00002338 /* Check for a __reduce_ex__ method. */
2339 __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);
2340 if (__reduce__ != NULL) {
2341 t = PyInt_FromLong(self->proto);
2342 if (t != NULL) {
2343 ARG_TUP(self, t);
2344 t = NULL;
2345 if (self->arg) {
2346 t = PyObject_Call(__reduce__,
2347 self->arg, NULL);
2348 FREE_ARG_TUP(self);
2349 }
2350 }
2351 }
2352 else {
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00002353 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2354 PyErr_Clear();
2355 else
2356 goto finally;
Guido van Rossumb289b872003-02-19 01:45:13 +00002357 /* Check for a __reduce__ method. */
2358 __reduce__ = PyObject_GetAttr(args, __reduce___str);
2359 if (__reduce__ != NULL) {
2360 t = PyObject_Call(__reduce__,
2361 empty_tuple, NULL);
2362 }
2363 else {
2364 PyErr_SetObject(UnpickleableError, args);
2365 goto finally;
2366 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002367 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002368 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002369
Tim Peters71fcda52003-02-14 23:05:28 +00002370 if (t == NULL)
2371 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00002372
Tim Peters71fcda52003-02-14 23:05:28 +00002373 if (PyString_Check(t)) {
2374 res = save_global(self, args, t);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002375 goto finally;
2376 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002377
Tim Peters71fcda52003-02-14 23:05:28 +00002378 if (! PyTuple_Check(t)) {
2379 cPickle_ErrFormat(PicklingError, "Value returned by "
2380 "%s must be string or tuple",
2381 "O", __reduce__);
2382 goto finally;
2383 }
2384
2385 size = PyTuple_Size(t);
2386 if (size < 2 || size > 5) {
2387 cPickle_ErrFormat(PicklingError, "tuple returned by "
2388 "%s must contain 2 through 5 elements",
2389 "O", __reduce__);
2390 goto finally;
2391 }
2392
2393 arg_tup = PyTuple_GET_ITEM(t, 1);
2394 if (!(PyTuple_Check(arg_tup) || arg_tup == Py_None)) {
2395 cPickle_ErrFormat(PicklingError, "Second element of "
2396 "tuple returned by %s must be a tuple",
2397 "O", __reduce__);
2398 goto finally;
2399 }
2400
2401 res = save_reduce(self, t, args);
Guido van Rossum60456fd1997-04-09 17:36:32 +00002402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002403 finally:
Martin v. Löwis5a395302002-08-04 08:20:23 +00002404 self->nesting--;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002405 Py_XDECREF(py_ob_id);
2406 Py_XDECREF(__reduce__);
2407 Py_XDECREF(t);
Tim Peters84e87f32001-03-17 04:50:51 +00002408
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002409 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002410}
2411
2412
2413static int
Tim Peterscba30e22003-02-01 06:24:36 +00002414dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002415{
2416 static char stop = STOP;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002417
Tim Peters4190fb82003-02-02 16:09:05 +00002418 if (self->proto >= 2) {
2419 char bytes[2];
2420
2421 bytes[0] = PROTO;
Tim Peters87482ea2003-02-02 16:16:30 +00002422 assert(self->proto >= 0 && self->proto < 256);
2423 bytes[1] = (char)self->proto;
Tim Peters4190fb82003-02-02 16:09:05 +00002424 if (self->write_func(self, bytes, 2) < 0)
2425 return -1;
2426 }
2427
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002428 if (save(self, args, 0) < 0)
2429 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002430
Tim Peters4190fb82003-02-02 16:09:05 +00002431 if (self->write_func(self, &stop, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002432 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002433
Tim Peters4190fb82003-02-02 16:09:05 +00002434 if (self->write_func(self, NULL, 0) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002435 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002437 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002438}
2439
2440static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002441Pickle_clear_memo(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002442{
Tim Peterscba30e22003-02-01 06:24:36 +00002443 if (self->memo)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002444 PyDict_Clear(self->memo);
2445 Py_INCREF(Py_None);
2446 return Py_None;
2447}
2448
2449static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002450Pickle_getvalue(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002451{
2452 int l, i, rsize, ssize, clear=1, lm;
2453 long ik;
2454 PyObject *k, *r;
2455 char *s, *p, *have_get;
2456 Pdata *data;
2457
2458 /* Can be called by Python code or C code */
Tim Peterscba30e22003-02-01 06:24:36 +00002459 if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002460 return NULL;
2461
2462 /* Check to make sure we are based on a list */
2463 if (! Pdata_Check(self->file)) {
2464 PyErr_SetString(PicklingError,
2465 "Attempt to getvalue() a non-list-based pickler");
2466 return NULL;
2467 }
2468
2469 /* flush write buffer */
2470 if (write_other(self, NULL, 0) < 0) return NULL;
2471
2472 data=(Pdata*)self->file;
2473 l=data->length;
2474
2475 /* set up an array to hold get/put status */
Tim Petersac5687a2003-02-02 18:08:34 +00002476 lm = PyDict_Size(self->memo);
2477 if (lm < 0) return NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002478 lm++;
Tim Petersac5687a2003-02-02 18:08:34 +00002479 have_get = malloc(lm);
2480 if (have_get == NULL) return PyErr_NoMemory();
2481 memset(have_get, 0, lm);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002482
2483 /* Scan for gets. */
Tim Petersac5687a2003-02-02 18:08:34 +00002484 for (rsize = 0, i = l; --i >= 0; ) {
2485 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002486
Tim Petersac5687a2003-02-02 18:08:34 +00002487 if (PyString_Check(k))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002488 rsize += PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002489
2490 else if (PyInt_Check(k)) { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002491 ik = PyInt_AsLong(k);
2492 if (ik == -1 && PyErr_Occurred())
2493 goto err;
Tim Petersac5687a2003-02-02 18:08:34 +00002494 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002495 PyErr_SetString(PicklingError,
2496 "Invalid get data");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002497 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002498 }
Tim Petersac5687a2003-02-02 18:08:34 +00002499 if (have_get[ik]) /* with matching get */
2500 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002501 }
2502
2503 else if (! (PyTuple_Check(k) &&
2504 PyTuple_GET_SIZE(k) == 2 &&
Tim Petersac5687a2003-02-02 18:08:34 +00002505 PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002506 ) {
2507 PyErr_SetString(PicklingError,
2508 "Unexpected data in internal list");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002509 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002510 }
2511
2512 else { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002513 ik = PyInt_AsLong(k);
2514 if (ik == -1 && PyErr_Occurred())
2515 goto err;
Tim Petersac5687a2003-02-02 18:08:34 +00002516 if (ik >= lm || ik == 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002517 PyErr_SetString(PicklingError,
2518 "Invalid get data");
2519 return NULL;
2520 }
Tim Petersac5687a2003-02-02 18:08:34 +00002521 have_get[ik] = 1;
2522 rsize += ik < 256 ? 2 : 5;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002523 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002524 }
2525
2526 /* Now generate the result */
Tim Petersac5687a2003-02-02 18:08:34 +00002527 r = PyString_FromStringAndSize(NULL, rsize);
2528 if (r == NULL) goto err;
2529 s = PyString_AS_STRING((PyStringObject *)r);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002530
Tim Petersac5687a2003-02-02 18:08:34 +00002531 for (i = 0; i < l; i++) {
2532 k = data->data[i];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002533
2534 if (PyString_Check(k)) {
Tim Petersac5687a2003-02-02 18:08:34 +00002535 ssize = PyString_GET_SIZE(k);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002536 if (ssize) {
Tim Petersac5687a2003-02-02 18:08:34 +00002537 p=PyString_AS_STRING((PyStringObject *)k);
2538 while (--ssize >= 0)
2539 *s++ = *p++;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002540 }
2541 }
2542
2543 else if (PyTuple_Check(k)) { /* get */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002544 ik = PyLong_AsLong(PyTuple_GET_ITEM(k, 0));
2545 if (ik == -1 && PyErr_Occurred())
2546 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002547 if (ik < 256) {
2548 *s++ = BINGET;
2549 *s++ = (int)(ik & 0xff);
2550 }
2551 else {
2552 *s++ = LONG_BINGET;
2553 *s++ = (int)(ik & 0xff);
2554 *s++ = (int)((ik >> 8) & 0xff);
2555 *s++ = (int)((ik >> 16) & 0xff);
2556 *s++ = (int)((ik >> 24) & 0xff);
2557 }
2558 }
2559
2560 else { /* put */
Guido van Rossumddefaf32007-01-14 03:31:43 +00002561 ik = PyLong_AsLong(k);
2562 if (ik == -1 && PyErr_Occurred())
2563 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002564
2565 if (have_get[ik]) { /* with matching get */
2566 if (ik < 256) {
2567 *s++ = BINPUT;
2568 *s++ = (int)(ik & 0xff);
2569 }
2570 else {
2571 *s++ = LONG_BINPUT;
2572 *s++ = (int)(ik & 0xff);
2573 *s++ = (int)((ik >> 8) & 0xff);
2574 *s++ = (int)((ik >> 16) & 0xff);
2575 *s++ = (int)((ik >> 24) & 0xff);
2576 }
2577 }
2578 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002579 }
2580
2581 if (clear) {
2582 PyDict_Clear(self->memo);
Tim Petersac5687a2003-02-02 18:08:34 +00002583 Pdata_clear(data, 0);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002584 }
2585
2586 free(have_get);
2587 return r;
2588 err:
2589 free(have_get);
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002590 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002591}
2592
2593static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002594Pickler_dump(Picklerobject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002595{
2596 PyObject *ob;
2597 int get=0;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002598
Tim Peterscba30e22003-02-01 06:24:36 +00002599 if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002600 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002601
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002602 if (dump(self, ob) < 0)
2603 return NULL;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002604
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002605 if (get) return Pickle_getvalue(self, NULL);
Guido van Rossum053b8df1998-11-25 16:18:00 +00002606
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002607 /* XXX Why does dump() return self? */
2608 Py_INCREF(self);
2609 return (PyObject*)self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002610}
2611
2612
Tim Peterscba30e22003-02-01 06:24:36 +00002613static struct PyMethodDef Pickler_methods[] =
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002614{
Neal Norwitzb0493252002-03-31 14:44:22 +00002615 {"dump", (PyCFunction)Pickler_dump, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002616 PyDoc_STR("dump(object) -- "
2617 "Write an object in pickle format to the object's pickle stream")},
Fred Drake0ebacc82002-05-01 20:36:39 +00002618 {"clear_memo", (PyCFunction)Pickle_clear_memo, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002619 PyDoc_STR("clear_memo() -- Clear the picklers memo")},
Neal Norwitzb0493252002-03-31 14:44:22 +00002620 {"getvalue", (PyCFunction)Pickle_getvalue, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00002621 PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},
Guido van Rossum60456fd1997-04-09 17:36:32 +00002622 {NULL, NULL} /* sentinel */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002623};
2624
2625
2626static Picklerobject *
Tim Peters5bd2a792003-02-01 16:45:06 +00002627newPicklerobject(PyObject *file, int proto)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002628{
2629 Picklerobject *self;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002630
Tim Peters5bd2a792003-02-01 16:45:06 +00002631 if (proto < 0)
Tim Peters8587b3c2003-02-13 15:44:41 +00002632 proto = HIGHEST_PROTOCOL;
2633 if (proto > HIGHEST_PROTOCOL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002634 PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "
2635 "the highest available protocol is %d",
Tim Peters8587b3c2003-02-13 15:44:41 +00002636 proto, HIGHEST_PROTOCOL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002637 return NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002638 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002639
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002640 self = PyObject_GC_New(Picklerobject, &Picklertype);
Tim Peters5bd2a792003-02-01 16:45:06 +00002641 if (self == NULL)
2642 return NULL;
2643 self->proto = proto;
2644 self->bin = proto > 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002645 self->fp = NULL;
2646 self->write = NULL;
2647 self->memo = NULL;
2648 self->arg = NULL;
2649 self->pers_func = NULL;
2650 self->inst_pers_func = NULL;
2651 self->write_buf = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002652 self->fast = 0;
Martin v. Löwis5a395302002-08-04 08:20:23 +00002653 self->nesting = 0;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002654 self->fast_container = 0;
2655 self->fast_memo = NULL;
2656 self->buf_size = 0;
2657 self->dispatch_table = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002658
Tim Peters5bd2a792003-02-01 16:45:06 +00002659 self->file = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002660 if (file)
2661 Py_INCREF(file);
Tim Peters5bd2a792003-02-01 16:45:06 +00002662 else {
2663 file = Pdata_New();
2664 if (file == NULL)
2665 goto err;
2666 }
2667 self->file = file;
Guido van Rossum053b8df1998-11-25 16:18:00 +00002668
Tim Peterscba30e22003-02-01 06:24:36 +00002669 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002670 goto err;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002671
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002672 if (PyFile_Check(file)) {
2673 self->fp = PyFile_AsFile(file);
2674 if (self->fp == NULL) {
Tim Peters5bd2a792003-02-01 16:45:06 +00002675 PyErr_SetString(PyExc_ValueError,
2676 "I/O operation on closed file");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002677 goto err;
2678 }
2679 self->write_func = write_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00002680 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002681 else if (PycStringIO_OutputCheck(file)) {
2682 self->write_func = write_cStringIO;
2683 }
2684 else if (file == Py_None) {
2685 self->write_func = write_none;
2686 }
2687 else {
2688 self->write_func = write_other;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002689
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002690 if (! Pdata_Check(file)) {
2691 self->write = PyObject_GetAttr(file, write_str);
2692 if (!self->write) {
2693 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00002694 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002695 "argument must have 'write' "
2696 "attribute");
2697 goto err;
2698 }
2699 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002700
Tim Peters5bd2a792003-02-01 16:45:06 +00002701 self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);
2702 if (self->write_buf == NULL) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002703 PyErr_NoMemory();
2704 goto err;
2705 }
2706 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002708 if (PyEval_GetRestricted()) {
2709 /* Restricted execution, get private tables */
Tim Peters5b7da392003-02-04 00:21:07 +00002710 PyObject *m = PyImport_Import(copy_reg_str);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002711
Tim Peters5b7da392003-02-04 00:21:07 +00002712 if (m == NULL)
2713 goto err;
2714 self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002715 Py_DECREF(m);
Tim Peters5b7da392003-02-04 00:21:07 +00002716 if (self->dispatch_table == NULL)
2717 goto err;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002718 }
2719 else {
Tim Peters5b7da392003-02-04 00:21:07 +00002720 self->dispatch_table = dispatch_table;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002721 Py_INCREF(dispatch_table);
2722 }
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002723 PyObject_GC_Track(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002724
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002725 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00002726
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002727 err:
Tim Peters5bd2a792003-02-01 16:45:06 +00002728 Py_DECREF(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002729 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002730}
2731
2732
2733static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00002734get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002735{
Martin v. Löwis15e62742006-02-27 16:46:16 +00002736 static char *kwlist[] = {"file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002737 PyObject *file = NULL;
Tim Peters5bd2a792003-02-01 16:45:06 +00002738 int proto = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002739
Tim Peters92c8bb32003-02-13 23:00:26 +00002740 /* XXX
Martin v. Löwis544f1192004-07-27 05:22:33 +00002741 * The documented signature is Pickler(file, protocol=0), but this
Tim Peters92c8bb32003-02-13 23:00:26 +00002742 * accepts Pickler() and Pickler(integer) too. The meaning then
2743 * is clear as mud, undocumented, and not supported by pickle.py.
2744 * I'm told Zope uses this, but I haven't traced into this code
2745 * far enough to figure out what it means.
Tim Peters5bd2a792003-02-01 16:45:06 +00002746 */
2747 if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002748 PyErr_Clear();
Tim Peters5bd2a792003-02-01 16:45:06 +00002749 proto = 0;
Martin v. Löwis544f1192004-07-27 05:22:33 +00002750 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",
2751 kwlist, &file, &proto))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002752 return NULL;
2753 }
Tim Peters5bd2a792003-02-01 16:45:06 +00002754 return (PyObject *)newPicklerobject(file, proto);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002755}
2756
2757
2758static void
Tim Peterscba30e22003-02-01 06:24:36 +00002759Pickler_dealloc(Picklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002760{
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002761 PyObject_GC_UnTrack(self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002762 Py_XDECREF(self->write);
2763 Py_XDECREF(self->memo);
2764 Py_XDECREF(self->fast_memo);
2765 Py_XDECREF(self->arg);
2766 Py_XDECREF(self->file);
2767 Py_XDECREF(self->pers_func);
2768 Py_XDECREF(self->inst_pers_func);
2769 Py_XDECREF(self->dispatch_table);
Tim Peters5bd2a792003-02-01 16:45:06 +00002770 PyMem_Free(self->write_buf);
Tim Peters3cfe7542003-05-21 21:29:48 +00002771 self->ob_type->tp_free((PyObject *)self);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002772}
2773
2774static int
2775Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
2776{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002777 Py_VISIT(self->write);
2778 Py_VISIT(self->memo);
2779 Py_VISIT(self->fast_memo);
2780 Py_VISIT(self->arg);
2781 Py_VISIT(self->file);
2782 Py_VISIT(self->pers_func);
2783 Py_VISIT(self->inst_pers_func);
2784 Py_VISIT(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002785 return 0;
2786}
2787
2788static int
2789Pickler_clear(Picklerobject *self)
2790{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002791 Py_CLEAR(self->write);
2792 Py_CLEAR(self->memo);
2793 Py_CLEAR(self->fast_memo);
2794 Py_CLEAR(self->arg);
2795 Py_CLEAR(self->file);
2796 Py_CLEAR(self->pers_func);
2797 Py_CLEAR(self->inst_pers_func);
2798 Py_CLEAR(self->dispatch_table);
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002799 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002800}
2801
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002802static PyObject *
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002803Pickler_get_pers_func(Picklerobject *p)
2804{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002805 if (p->pers_func == NULL)
2806 PyErr_SetString(PyExc_AttributeError, "persistent_id");
2807 else
2808 Py_INCREF(p->pers_func);
2809 return p->pers_func;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002810}
2811
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002812static int
2813Pickler_set_pers_func(Picklerobject *p, PyObject *v)
2814{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002815 if (v == NULL) {
2816 PyErr_SetString(PyExc_TypeError,
2817 "attribute deletion is not supported");
2818 return -1;
2819 }
2820 Py_XDECREF(p->pers_func);
2821 Py_INCREF(v);
2822 p->pers_func = v;
2823 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002824}
2825
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002826static int
2827Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)
2828{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002829 if (v == NULL) {
2830 PyErr_SetString(PyExc_TypeError,
2831 "attribute deletion is not supported");
2832 return -1;
2833 }
2834 Py_XDECREF(p->inst_pers_func);
2835 Py_INCREF(v);
2836 p->inst_pers_func = v;
2837 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002838}
2839
2840static PyObject *
2841Pickler_get_memo(Picklerobject *p)
2842{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002843 if (p->memo == NULL)
2844 PyErr_SetString(PyExc_AttributeError, "memo");
2845 else
2846 Py_INCREF(p->memo);
2847 return p->memo;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002848}
2849
2850static int
2851Pickler_set_memo(Picklerobject *p, PyObject *v)
2852{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002853 if (v == NULL) {
2854 PyErr_SetString(PyExc_TypeError,
2855 "attribute deletion is not supported");
2856 return -1;
2857 }
2858 if (!PyDict_Check(v)) {
2859 PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");
2860 return -1;
2861 }
2862 Py_XDECREF(p->memo);
2863 Py_INCREF(v);
2864 p->memo = v;
2865 return 0;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002866}
2867
2868static PyObject *
2869Pickler_get_error(Picklerobject *p)
2870{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002871 /* why is this an attribute on the Pickler? */
2872 Py_INCREF(PicklingError);
2873 return PicklingError;
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002874}
2875
2876static PyMemberDef Pickler_members[] = {
2877 {"binary", T_INT, offsetof(Picklerobject, bin)},
2878 {"fast", T_INT, offsetof(Picklerobject, fast)},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002879 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002880};
2881
2882static PyGetSetDef Pickler_getsets[] = {
Tim Peterscba30e22003-02-01 06:24:36 +00002883 {"persistent_id", (getter)Pickler_get_pers_func,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002884 (setter)Pickler_set_pers_func},
2885 {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},
2886 {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},
Jeremy Hylton3eb46f32001-10-16 17:10:49 +00002887 {"PicklingError", (getter)Pickler_get_error, NULL},
2888 {NULL}
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002889};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002890
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002891PyDoc_STRVAR(Picklertype__doc__,
2892"Objects that know how to pickle objects\n");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002893
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002894static PyTypeObject Picklertype = {
2895 PyObject_HEAD_INIT(NULL)
Guido van Rossum60456fd1997-04-09 17:36:32 +00002896 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00002897 "cPickle.Pickler", /*tp_name*/
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002898 sizeof(Picklerobject), /*tp_basicsize*/
2899 0,
2900 (destructor)Pickler_dealloc, /* tp_dealloc */
2901 0, /* tp_print */
2902 0, /* tp_getattr */
2903 0, /* tp_setattr */
2904 0, /* tp_compare */
2905 0, /* tp_repr */
2906 0, /* tp_as_number */
2907 0, /* tp_as_sequence */
2908 0, /* tp_as_mapping */
2909 0, /* tp_hash */
2910 0, /* tp_call */
2911 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002912 PyObject_GenericGetAttr, /* tp_getattro */
2913 PyObject_GenericSetAttr, /* tp_setattro */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002914 0, /* tp_as_buffer */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002915 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002916 Picklertype__doc__, /* tp_doc */
Jeremy Hylton4cf63192003-04-09 21:05:12 +00002917 (traverseproc)Pickler_traverse, /* tp_traverse */
2918 (inquiry)Pickler_clear, /* tp_clear */
Jeremy Hyltona0fb1772001-10-12 04:11:06 +00002919 0, /* tp_richcompare */
2920 0, /* tp_weaklistoffset */
2921 0, /* tp_iter */
2922 0, /* tp_iternext */
2923 Pickler_methods, /* tp_methods */
2924 Pickler_members, /* tp_members */
2925 Pickler_getsets, /* tp_getset */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00002926};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002927
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002928static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00002929find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002930{
2931 PyObject *global = 0, *module;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002932
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002933 if (fc) {
2934 if (fc==Py_None) {
Tim Peters92c8bb32003-02-13 23:00:26 +00002935 PyErr_SetString(UnpicklingError, "Global and instance "
2936 "pickles are not supported.");
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002937 return NULL;
2938 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002939 return PyObject_CallFunctionObjArgs(fc, py_module_name,
2940 py_global_name, NULL);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002941 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00002942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002943 module = PySys_GetObject("modules");
2944 if (module == NULL)
2945 return NULL;
Jeremy Hyltond1055231998-08-11 19:52:51 +00002946
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002947 module = PyDict_GetItem(module, py_module_name);
2948 if (module == NULL) {
2949 module = PyImport_Import(py_module_name);
2950 if (!module)
2951 return NULL;
2952 global = PyObject_GetAttr(module, py_global_name);
2953 Py_DECREF(module);
2954 }
2955 else
2956 global = PyObject_GetAttr(module, py_global_name);
2957 return global;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002958}
2959
Guido van Rossum2f4caa41997-01-06 22:59:08 +00002960static int
Tim Peterscba30e22003-02-01 06:24:36 +00002961marker(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002962{
2963 if (self->num_marks < 1) {
2964 PyErr_SetString(UnpicklingError, "could not find MARK");
2965 return -1;
2966 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00002967
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002968 return self->marks[--self->num_marks];
Guido van Rossum60456fd1997-04-09 17:36:32 +00002969}
2970
Tim Peters84e87f32001-03-17 04:50:51 +00002971
Guido van Rossum60456fd1997-04-09 17:36:32 +00002972static int
Tim Peterscba30e22003-02-01 06:24:36 +00002973load_none(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002974{
2975 PDATA_APPEND(self->stack, Py_None, -1);
2976 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002977}
2978
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002979static int
Tim Peterscba30e22003-02-01 06:24:36 +00002980bad_readline(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002981{
2982 PyErr_SetString(UnpicklingError, "pickle data was truncated");
2983 return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00002984}
Guido van Rossum60456fd1997-04-09 17:36:32 +00002985
2986static int
Tim Peterscba30e22003-02-01 06:24:36 +00002987load_int(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002988{
2989 PyObject *py_int = 0;
2990 char *endptr, *s;
2991 int len, res = -1;
2992 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002993
Tim Peters0bc93f52003-02-02 18:29:33 +00002994 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002995 if (len < 2) return bad_readline();
2996 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00002997
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00002998 errno = 0;
2999 l = strtol(s, &endptr, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003000
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003001 if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {
3002 /* Hm, maybe we've got something long. Let's try reading
3003 it as a Python long object. */
3004 errno = 0;
3005 py_int = PyLong_FromString(s, NULL, 0);
3006 if (py_int == NULL) {
3007 PyErr_SetString(PyExc_ValueError,
3008 "could not convert string to int");
3009 goto finally;
3010 }
3011 }
3012 else {
Guido van Rossume2763392002-04-05 19:30:08 +00003013 if (len == 3 && (l == 0 || l == 1)) {
3014 if (!( py_int = PyBool_FromLong(l))) goto finally;
3015 }
3016 else {
3017 if (!( py_int = PyInt_FromLong(l))) goto finally;
3018 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003019 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003020
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003021 free(s);
3022 PDATA_PUSH(self->stack, py_int, -1);
3023 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003024
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003025 finally:
3026 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003027
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003028 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003029}
3030
Tim Peters3c67d792003-02-02 17:59:11 +00003031static int
3032load_bool(Unpicklerobject *self, PyObject *boolean)
3033{
3034 assert(boolean == Py_True || boolean == Py_False);
Tim Peterse0a39072003-02-03 15:45:56 +00003035 PDATA_APPEND(self->stack, boolean, -1);
Tim Peters3c67d792003-02-02 17:59:11 +00003036 return 0;
3037}
3038
Tim Petersee1a53c2003-02-02 02:57:53 +00003039/* s contains x bytes of a little-endian integer. Return its value as a
3040 * C int. Obscure: when x is 1 or 2, this is an unsigned little-endian
3041 * int, but when x is 4 it's a signed one. This is an historical source
3042 * of x-platform bugs.
3043 */
Tim Peters84e87f32001-03-17 04:50:51 +00003044static long
Tim Petersee1a53c2003-02-02 02:57:53 +00003045calc_binint(char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003046{
3047 unsigned char c;
3048 int i;
3049 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003050
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003051 for (i = 0, l = 0L; i < x; i++) {
3052 c = (unsigned char)s[i];
3053 l |= (long)c << (i * 8);
3054 }
Tim Petersbfa18f72001-04-10 01:54:42 +00003055#if SIZEOF_LONG > 4
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003056 /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)
3057 * is signed, so on a box with longs bigger than 4 bytes we need
3058 * to extend a BININT's sign bit to the full width.
3059 */
3060 if (x == 4 && l & (1L << 31))
3061 l |= (~0L) << 32;
Tim Petersbfa18f72001-04-10 01:54:42 +00003062#endif
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003063 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003064}
3065
3066
3067static int
Tim Peterscba30e22003-02-01 06:24:36 +00003068load_binintx(Unpicklerobject *self, char *s, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003069{
3070 PyObject *py_int = 0;
3071 long l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003073 l = calc_binint(s, x);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003074
Tim Peterscba30e22003-02-01 06:24:36 +00003075 if (!( py_int = PyInt_FromLong(l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003076 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003077
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003078 PDATA_PUSH(self->stack, py_int, -1);
3079 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003080}
3081
3082
3083static int
Tim Peterscba30e22003-02-01 06:24:36 +00003084load_binint(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003085{
3086 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003087
Tim Peters0bc93f52003-02-02 18:29:33 +00003088 if (self->read_func(self, &s, 4) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003089 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003090
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003091 return load_binintx(self, s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003092}
3093
3094
3095static int
Tim Peterscba30e22003-02-01 06:24:36 +00003096load_binint1(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003097{
3098 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003099
Tim Peters0bc93f52003-02-02 18:29:33 +00003100 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003101 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003102
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003103 return load_binintx(self, s, 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003104}
3105
3106
3107static int
Tim Peterscba30e22003-02-01 06:24:36 +00003108load_binint2(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003109{
3110 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003111
Tim Peters0bc93f52003-02-02 18:29:33 +00003112 if (self->read_func(self, &s, 2) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003113 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003114
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003115 return load_binintx(self, s, 2);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003116}
Tim Peters84e87f32001-03-17 04:50:51 +00003117
Guido van Rossum60456fd1997-04-09 17:36:32 +00003118static int
Tim Peterscba30e22003-02-01 06:24:36 +00003119load_long(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003120{
3121 PyObject *l = 0;
3122 char *end, *s;
3123 int len, res = -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003124
Tim Peters0bc93f52003-02-02 18:29:33 +00003125 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003126 if (len < 2) return bad_readline();
3127 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003128
Tim Peterscba30e22003-02-01 06:24:36 +00003129 if (!( l = PyLong_FromString(s, &end, 0)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003130 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003131
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003132 free(s);
3133 PDATA_PUSH(self->stack, l, -1);
3134 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003135
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003136 finally:
3137 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003139 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003140}
3141
Tim Petersee1a53c2003-02-02 02:57:53 +00003142/* 'size' bytes contain the # of bytes of little-endian 256's-complement
3143 * data following.
3144 */
3145static int
3146load_counted_long(Unpicklerobject *self, int size)
3147{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003148 Py_ssize_t i;
Tim Petersee1a53c2003-02-02 02:57:53 +00003149 char *nbytes;
3150 unsigned char *pdata;
3151 PyObject *along;
3152
3153 assert(size == 1 || size == 4);
3154 i = self->read_func(self, &nbytes, size);
3155 if (i < 0) return -1;
3156
3157 size = calc_binint(nbytes, size);
3158 if (size < 0) {
3159 /* Corrupt or hostile pickle -- we never write one like
3160 * this.
3161 */
Tim Peters0c7c48e2003-02-03 22:07:24 +00003162 PyErr_SetString(UnpicklingError, "LONG pickle has negative "
Tim Petersee1a53c2003-02-02 02:57:53 +00003163 "byte count");
3164 return -1;
3165 }
3166
3167 if (size == 0)
3168 along = PyLong_FromLong(0L);
3169 else {
3170 /* Read the raw little-endian bytes & convert. */
Neal Norwitz529baf22003-02-02 17:08:33 +00003171 i = self->read_func(self, (char **)&pdata, size);
Tim Petersee1a53c2003-02-02 02:57:53 +00003172 if (i < 0) return -1;
3173 along = _PyLong_FromByteArray(pdata, (size_t)size,
3174 1 /* little endian */, 1 /* signed */);
3175 }
3176 if (along == NULL)
3177 return -1;
3178 PDATA_PUSH(self->stack, along, -1);
3179 return 0;
3180}
Tim Peters84e87f32001-03-17 04:50:51 +00003181
Guido van Rossum60456fd1997-04-09 17:36:32 +00003182static int
Tim Peterscba30e22003-02-01 06:24:36 +00003183load_float(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003184{
3185 PyObject *py_float = 0;
3186 char *endptr, *s;
3187 int len, res = -1;
3188 double d;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003189
Tim Peters0bc93f52003-02-02 18:29:33 +00003190 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003191 if (len < 2) return bad_readline();
3192 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003194 errno = 0;
Martin v. Löwis737ea822004-06-08 18:52:54 +00003195 d = PyOS_ascii_strtod(s, &endptr);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003196
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003197 if (errno || (endptr[0] != '\n') || (endptr[1] != '\0')) {
3198 PyErr_SetString(PyExc_ValueError,
3199 "could not convert string to float");
3200 goto finally;
3201 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003202
Tim Peterscba30e22003-02-01 06:24:36 +00003203 if (!( py_float = PyFloat_FromDouble(d)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003204 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003205
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003206 free(s);
3207 PDATA_PUSH(self->stack, py_float, -1);
3208 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003209
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003210 finally:
3211 free(s);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003212
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003213 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003214}
3215
Guido van Rossum60456fd1997-04-09 17:36:32 +00003216static int
Tim Peterscba30e22003-02-01 06:24:36 +00003217load_binfloat(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003218{
Tim Peters9905b942003-03-20 20:53:32 +00003219 PyObject *py_float;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003220 double x;
3221 char *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003222
Tim Peters0bc93f52003-02-02 18:29:33 +00003223 if (self->read_func(self, &p, 8) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003224 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003225
Tim Peters9905b942003-03-20 20:53:32 +00003226 x = _PyFloat_Unpack8((unsigned char *)p, 0);
3227 if (x == -1.0 && PyErr_Occurred())
3228 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003229
Tim Peters9905b942003-03-20 20:53:32 +00003230 py_float = PyFloat_FromDouble(x);
3231 if (py_float == NULL)
3232 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003233
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003234 PDATA_PUSH(self->stack, py_float, -1);
3235 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003236}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003237
3238static int
Tim Peterscba30e22003-02-01 06:24:36 +00003239load_string(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003240{
3241 PyObject *str = 0;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003242 int len, res = -1;
3243 char *s, *p;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003244
Tim Peters0bc93f52003-02-02 18:29:33 +00003245 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003246 if (len < 2) return bad_readline();
3247 if (!( s=pystrndup(s,len))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003248
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003249
3250 /* Strip outermost quotes */
3251 while (s[len-1] <= ' ')
3252 len--;
3253 if(s[0]=='"' && s[len-1]=='"'){
3254 s[len-1] = '\0';
3255 p = s + 1 ;
3256 len -= 2;
3257 } else if(s[0]=='\'' && s[len-1]=='\''){
3258 s[len-1] = '\0';
3259 p = s + 1 ;
3260 len -= 2;
3261 } else
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003262 goto insecure;
3263 /********************************************/
Guido van Rossum9716aaa1997-12-08 15:15:16 +00003264
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003265 str = PyString_DecodeEscape(p, len, NULL, 0, NULL);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003266 free(s);
Martin v. Löwis8a8da792002-08-14 07:46:28 +00003267 if (str) {
3268 PDATA_PUSH(self->stack, str, -1);
3269 res = 0;
3270 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003271 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00003272
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003273 insecure:
3274 free(s);
3275 PyErr_SetString(PyExc_ValueError,"insecure string pickle");
3276 return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003277}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003278
3279
3280static int
Tim Peterscba30e22003-02-01 06:24:36 +00003281load_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003282{
3283 PyObject *py_string = 0;
3284 long l;
3285 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003286
Tim Peters0bc93f52003-02-02 18:29:33 +00003287 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003288
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003289 l = calc_binint(s, 4);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003290
Tim Peters0bc93f52003-02-02 18:29:33 +00003291 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003292 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003293
Tim Peterscba30e22003-02-01 06:24:36 +00003294 if (!( py_string = PyString_FromStringAndSize(s, l)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003295 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003296
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003297 PDATA_PUSH(self->stack, py_string, -1);
3298 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003299}
3300
3301
3302static int
Tim Peterscba30e22003-02-01 06:24:36 +00003303load_short_binstring(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003304{
3305 PyObject *py_string = 0;
3306 unsigned char l;
3307 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003308
Tim Peters0bc93f52003-02-02 18:29:33 +00003309 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003310 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003311
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003312 l = (unsigned char)s[0];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003313
Tim Peters0bc93f52003-02-02 18:29:33 +00003314 if (self->read_func(self, &s, l) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003315
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003316 if (!( py_string = PyString_FromStringAndSize(s, l))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003317
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003318 PDATA_PUSH(self->stack, py_string, -1);
3319 return 0;
Tim Peters84e87f32001-03-17 04:50:51 +00003320}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003321
3322
3323static 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}
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003342
3343
3344static int
Tim Peterscba30e22003-02-01 06:24:36 +00003345load_binunicode(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003346{
3347 PyObject *unicode;
3348 long l;
3349 char *s;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003350
Tim Peters0bc93f52003-02-02 18:29:33 +00003351 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003352
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003353 l = calc_binint(s, 4);
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003354
Tim Peters0bc93f52003-02-02 18:29:33 +00003355 if (self->read_func(self, &s, l) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003356 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003357
Tim Peterscba30e22003-02-01 06:24:36 +00003358 if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003359 return -1;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003360
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003361 PDATA_PUSH(self->stack, unicode, -1);
3362 return 0;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00003363}
3364
3365
3366static int
Tim Peterscba30e22003-02-01 06:24:36 +00003367load_tuple(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003368{
3369 PyObject *tup;
3370 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003371
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003372 if ((i = marker(self)) < 0) return -1;
3373 if (!( tup=Pdata_popTuple(self->stack, i))) return -1;
3374 PDATA_PUSH(self->stack, tup, -1);
3375 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003376}
3377
3378static int
Tim Peters1d63c9f2003-02-02 20:29:39 +00003379load_counted_tuple(Unpicklerobject *self, int len)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003380{
Tim Peters1d63c9f2003-02-02 20:29:39 +00003381 PyObject *tup = PyTuple_New(len);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003382
Tim Peters1d63c9f2003-02-02 20:29:39 +00003383 if (tup == NULL)
3384 return -1;
3385
3386 while (--len >= 0) {
3387 PyObject *element;
3388
3389 PDATA_POP(self->stack, element);
3390 if (element == NULL)
3391 return -1;
3392 PyTuple_SET_ITEM(tup, len, element);
3393 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003394 PDATA_PUSH(self->stack, tup, -1);
3395 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003396}
3397
3398static int
Tim Peterscba30e22003-02-01 06:24:36 +00003399load_empty_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003400{
3401 PyObject *list;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003402
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003403 if (!( list=PyList_New(0))) return -1;
3404 PDATA_PUSH(self->stack, list, -1);
3405 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003406}
3407
3408static int
Tim Peterscba30e22003-02-01 06:24:36 +00003409load_empty_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003410{
3411 PyObject *dict;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003412
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003413 if (!( dict=PyDict_New())) return -1;
3414 PDATA_PUSH(self->stack, dict, -1);
3415 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003416}
3417
3418
3419static int
Tim Peterscba30e22003-02-01 06:24:36 +00003420load_list(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003421{
3422 PyObject *list = 0;
3423 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003425 if ((i = marker(self)) < 0) return -1;
3426 if (!( list=Pdata_popList(self->stack, i))) return -1;
3427 PDATA_PUSH(self->stack, list, -1);
3428 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003429}
3430
3431static int
Tim Peterscba30e22003-02-01 06:24:36 +00003432load_dict(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003433{
3434 PyObject *dict, *key, *value;
3435 int i, j, k;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003436
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003437 if ((i = marker(self)) < 0) return -1;
3438 j=self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003440 if (!( dict = PyDict_New())) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003441
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003442 for (k = i+1; k < j; k += 2) {
3443 key =self->stack->data[k-1];
3444 value=self->stack->data[k ];
3445 if (PyDict_SetItem(dict, key, value) < 0) {
3446 Py_DECREF(dict);
3447 return -1;
3448 }
3449 }
3450 Pdata_clear(self->stack, i);
3451 PDATA_PUSH(self->stack, dict, -1);
3452 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003453}
3454
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003455static PyObject *
3456Instance_New(PyObject *cls, PyObject *args)
3457{
3458 PyObject *r = 0;
3459
3460 if ((r=PyObject_CallObject(cls, args))) return r;
3461
3462 {
3463 PyObject *tp, *v, *tb, *tmp_value;
3464
3465 PyErr_Fetch(&tp, &v, &tb);
3466 tmp_value = v;
3467 /* NULL occurs when there was a KeyboardInterrupt */
3468 if (tmp_value == NULL)
3469 tmp_value = Py_None;
3470 if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {
3471 Py_XDECREF(v);
3472 v=r;
3473 }
3474 PyErr_Restore(tp,v,tb);
3475 }
3476 return NULL;
3477}
3478
Guido van Rossum60456fd1997-04-09 17:36:32 +00003479
3480static int
Tim Peterscba30e22003-02-01 06:24:36 +00003481load_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003482{
3483 PyObject *class, *tup, *obj=0;
3484 int i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003485
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003486 if ((i = marker(self)) < 0) return -1;
3487 if (!( tup=Pdata_popTuple(self->stack, i+1))) return -1;
3488 PDATA_POP(self->stack, class);
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003489 if (class) {
3490 obj = Instance_New(class, tup);
3491 Py_DECREF(class);
3492 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003493 Py_DECREF(tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003494
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003495 if (! obj) return -1;
3496 PDATA_PUSH(self->stack, obj, -1);
3497 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003498}
3499
3500
3501static int
Tim Peterscba30e22003-02-01 06:24:36 +00003502load_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003503{
3504 PyObject *tup, *class=0, *obj=0, *module_name, *class_name;
3505 int i, len;
3506 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003507
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003508 if ((i = marker(self)) < 0) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003509
Tim Peters0bc93f52003-02-02 18:29:33 +00003510 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003511 if (len < 2) return bad_readline();
3512 module_name = PyString_FromStringAndSize(s, len - 1);
3513 if (!module_name) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003514
Tim Peters0bc93f52003-02-02 18:29:33 +00003515 if ((len = self->readline_func(self, &s)) >= 0) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003516 if (len < 2) return bad_readline();
3517 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003518 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003519 self->find_class);
3520 Py_DECREF(class_name);
3521 }
3522 }
3523 Py_DECREF(module_name);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003524
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003525 if (! class) return -1;
Tim Peters84e87f32001-03-17 04:50:51 +00003526
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003527 if ((tup=Pdata_popTuple(self->stack, i))) {
Guido van Rossum512ab9f2006-08-17 22:28:49 +00003528 obj = Instance_New(class, tup);
3529 Py_DECREF(tup);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003530 }
3531 Py_DECREF(class);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003532
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003533 if (! obj) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00003534
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003535 PDATA_PUSH(self->stack, obj, -1);
3536 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003537}
3538
Tim Peterseab7db32003-02-13 18:24:14 +00003539static int
3540load_newobj(Unpicklerobject *self)
3541{
3542 PyObject *args = NULL;
3543 PyObject *clsraw = NULL;
3544 PyTypeObject *cls; /* clsraw cast to its true type */
3545 PyObject *obj;
3546
3547 /* Stack is ... cls argtuple, and we want to call
3548 * cls.__new__(cls, *argtuple).
3549 */
3550 PDATA_POP(self->stack, args);
3551 if (args == NULL) goto Fail;
3552 if (! PyTuple_Check(args)) {
3553 PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "
3554 "tuple.");
3555 goto Fail;
3556 }
3557
3558 PDATA_POP(self->stack, clsraw);
3559 cls = (PyTypeObject *)clsraw;
3560 if (cls == NULL) goto Fail;
3561 if (! PyType_Check(cls)) {
3562 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3563 "isn't a type object");
3564 goto Fail;
3565 }
3566 if (cls->tp_new == NULL) {
3567 PyErr_SetString(UnpicklingError, "NEWOBJ class argument "
3568 "has NULL tp_new");
3569 goto Fail;
3570 }
3571
3572 /* Call __new__. */
3573 obj = cls->tp_new(cls, args, NULL);
3574 if (obj == NULL) goto Fail;
3575
3576 Py_DECREF(args);
3577 Py_DECREF(clsraw);
3578 PDATA_PUSH(self->stack, obj, -1);
3579 return 0;
3580
3581 Fail:
3582 Py_XDECREF(args);
3583 Py_XDECREF(clsraw);
3584 return -1;
3585}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003586
3587static int
Tim Peterscba30e22003-02-01 06:24:36 +00003588load_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003589{
3590 PyObject *class = 0, *module_name = 0, *class_name = 0;
3591 int len;
3592 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003593
Tim Peters0bc93f52003-02-02 18:29:33 +00003594 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003595 if (len < 2) return bad_readline();
3596 module_name = PyString_FromStringAndSize(s, len - 1);
3597 if (!module_name) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003598
Tim Peters0bc93f52003-02-02 18:29:33 +00003599 if ((len = self->readline_func(self, &s)) >= 0) {
Tim Peters4e52ca82002-12-07 02:43:28 +00003600 if (len < 2) {
3601 Py_DECREF(module_name);
3602 return bad_readline();
3603 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003604 if ((class_name = PyString_FromStringAndSize(s, len - 1))) {
Tim Peterscba30e22003-02-01 06:24:36 +00003605 class = find_class(module_name, class_name,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003606 self->find_class);
3607 Py_DECREF(class_name);
3608 }
3609 }
3610 Py_DECREF(module_name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00003611
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003612 if (! class) return -1;
3613 PDATA_PUSH(self->stack, class, -1);
3614 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003615}
3616
3617
3618static int
Tim Peterscba30e22003-02-01 06:24:36 +00003619load_persid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003620{
3621 PyObject *pid = 0;
3622 int len;
3623 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003624
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003625 if (self->pers_func) {
Tim Peters0bc93f52003-02-02 18:29:33 +00003626 if ((len = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003627 if (len < 2) return bad_readline();
3628
3629 pid = PyString_FromStringAndSize(s, len - 1);
3630 if (!pid) return -1;
3631
3632 if (PyList_Check(self->pers_func)) {
3633 if (PyList_Append(self->pers_func, pid) < 0) {
3634 Py_DECREF(pid);
3635 return -1;
3636 }
3637 }
3638 else {
3639 ARG_TUP(self, pid);
3640 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00003641 pid = PyObject_Call(self->pers_func, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003642 NULL);
3643 FREE_ARG_TUP(self);
3644 }
3645 }
3646
3647 if (! pid) return -1;
3648
3649 PDATA_PUSH(self->stack, pid, -1);
3650 return 0;
3651 }
3652 else {
3653 PyErr_SetString(UnpicklingError,
3654 "A load persistent id instruction was encountered,\n"
3655 "but no persistent_load function was specified.");
3656 return -1;
3657 }
3658}
3659
3660static int
Tim Peterscba30e22003-02-01 06:24:36 +00003661load_binpersid(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003662{
3663 PyObject *pid = 0;
3664
3665 if (self->pers_func) {
3666 PDATA_POP(self->stack, pid);
3667 if (! pid) return -1;
3668
3669 if (PyList_Check(self->pers_func)) {
3670 if (PyList_Append(self->pers_func, pid) < 0) {
3671 Py_DECREF(pid);
3672 return -1;
3673 }
3674 }
3675 else {
3676 ARG_TUP(self, pid);
3677 if (self->arg) {
3678 pid = PyObject_Call(self->pers_func, self->arg,
3679 NULL);
3680 FREE_ARG_TUP(self);
3681 }
3682 if (! pid) return -1;
3683 }
3684
3685 PDATA_PUSH(self->stack, pid, -1);
3686 return 0;
3687 }
3688 else {
3689 PyErr_SetString(UnpicklingError,
3690 "A load persistent id instruction was encountered,\n"
3691 "but no persistent_load function was specified.");
3692 return -1;
3693 }
3694}
3695
3696
3697static int
Tim Peterscba30e22003-02-01 06:24:36 +00003698load_pop(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003699{
3700 int len;
3701
3702 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
3703
3704 /* Note that we split the (pickle.py) stack into two stacks,
3705 an object stack and a mark stack. We have to be clever and
3706 pop the right one. We do this by looking at the top of the
3707 mark stack.
3708 */
3709
3710 if ((self->num_marks > 0) &&
3711 (self->marks[self->num_marks - 1] == len))
3712 self->num_marks--;
3713 else {
3714 len--;
3715 Py_DECREF(self->stack->data[len]);
3716 self->stack->length=len;
3717 }
3718
3719 return 0;
3720}
3721
3722
3723static int
Tim Peterscba30e22003-02-01 06:24:36 +00003724load_pop_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003725{
3726 int i;
3727
3728 if ((i = marker(self)) < 0)
3729 return -1;
3730
3731 Pdata_clear(self->stack, i);
3732
3733 return 0;
3734}
3735
3736
3737static int
Tim Peterscba30e22003-02-01 06:24:36 +00003738load_dup(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003739{
3740 PyObject *last;
3741 int len;
3742
3743 if ((len = self->stack->length) <= 0) return stackUnderflow();
3744 last=self->stack->data[len-1];
3745 Py_INCREF(last);
3746 PDATA_PUSH(self->stack, last, -1);
3747 return 0;
3748}
3749
3750
3751static int
Tim Peterscba30e22003-02-01 06:24:36 +00003752load_get(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003753{
3754 PyObject *py_str = 0, *value = 0;
3755 int len;
3756 char *s;
3757 int rc;
3758
Tim Peters0bc93f52003-02-02 18:29:33 +00003759 if ((len = self->readline_func(self, &s)) < 0) return -1;
Guido van Rossumf9ffb031999-02-04 14:54:04 +00003760 if (len < 2) return bad_readline();
Tim Peters84e87f32001-03-17 04:50:51 +00003761
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003762 if (!( py_str = PyString_FromStringAndSize(s, len - 1))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003763
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003764 value = PyDict_GetItem(self->memo, py_str);
3765 if (! value) {
3766 PyErr_SetObject(BadPickleGet, py_str);
3767 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003768 }
3769 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003770 PDATA_APPEND(self->stack, value, -1);
3771 rc = 0;
3772 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003773
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003774 Py_DECREF(py_str);
3775 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003776}
3777
3778
3779static int
Tim Peterscba30e22003-02-01 06:24:36 +00003780load_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003781{
3782 PyObject *py_key = 0, *value = 0;
3783 unsigned char key;
3784 char *s;
3785 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003786
Tim Peters0bc93f52003-02-02 18:29:33 +00003787 if (self->read_func(self, &s, 1) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003788
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003789 key = (unsigned char)s[0];
3790 if (!( py_key = PyInt_FromLong((long)key))) return -1;
Guido van Rossumea2b7152000-05-09 18:14:50 +00003791
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003792 value = PyDict_GetItem(self->memo, py_key);
3793 if (! value) {
3794 PyErr_SetObject(BadPickleGet, py_key);
3795 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003796 }
3797 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003798 PDATA_APPEND(self->stack, value, -1);
3799 rc = 0;
3800 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00003801
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003802 Py_DECREF(py_key);
3803 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003804}
3805
3806
3807static int
Tim Peterscba30e22003-02-01 06:24:36 +00003808load_long_binget(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003809{
3810 PyObject *py_key = 0, *value = 0;
3811 unsigned char c;
3812 char *s;
3813 long key;
3814 int rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003815
Tim Peters0bc93f52003-02-02 18:29:33 +00003816 if (self->read_func(self, &s, 4) < 0) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003817
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003818 c = (unsigned char)s[0];
3819 key = (long)c;
3820 c = (unsigned char)s[1];
3821 key |= (long)c << 8;
3822 c = (unsigned char)s[2];
3823 key |= (long)c << 16;
3824 c = (unsigned char)s[3];
3825 key |= (long)c << 24;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003826
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003827 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3828
3829 value = PyDict_GetItem(self->memo, py_key);
3830 if (! value) {
3831 PyErr_SetObject(BadPickleGet, py_key);
3832 rc = -1;
Tim Peters92c8bb32003-02-13 23:00:26 +00003833 }
3834 else {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003835 PDATA_APPEND(self->stack, value, -1);
3836 rc = 0;
3837 }
3838
3839 Py_DECREF(py_key);
3840 return rc;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003841}
3842
Tim Peters2d629652003-02-04 05:06:17 +00003843/* Push an object from the extension registry (EXT[124]). nbytes is
3844 * the number of bytes following the opcode, holding the index (code) value.
3845 */
3846static int
3847load_extension(Unpicklerobject *self, int nbytes)
3848{
3849 char *codebytes; /* the nbytes bytes after the opcode */
3850 long code; /* calc_binint returns long */
3851 PyObject *py_code; /* code as a Python int */
3852 PyObject *obj; /* the object to push */
3853 PyObject *pair; /* (module_name, class_name) */
3854 PyObject *module_name, *class_name;
3855
3856 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
3857 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
3858 code = calc_binint(codebytes, nbytes);
3859 if (code <= 0) { /* note that 0 is forbidden */
3860 /* Corrupt or hostile pickle. */
3861 PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");
3862 return -1;
3863 }
3864
3865 /* Look for the code in the cache. */
3866 py_code = PyInt_FromLong(code);
3867 if (py_code == NULL) return -1;
3868 obj = PyDict_GetItem(extension_cache, py_code);
3869 if (obj != NULL) {
3870 /* Bingo. */
3871 Py_DECREF(py_code);
3872 PDATA_APPEND(self->stack, obj, -1);
3873 return 0;
3874 }
3875
3876 /* Look up the (module_name, class_name) pair. */
3877 pair = PyDict_GetItem(inverted_registry, py_code);
3878 if (pair == NULL) {
3879 Py_DECREF(py_code);
3880 PyErr_Format(PyExc_ValueError, "unregistered extension "
3881 "code %ld", code);
3882 return -1;
3883 }
3884 /* Since the extension registry is manipulable via Python code,
Tim Petersfa05ce32003-02-04 05:20:32 +00003885 * confirm that pair is really a 2-tuple of strings.
Tim Peters2d629652003-02-04 05:06:17 +00003886 */
3887 if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||
3888 !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||
3889 !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {
3890 Py_DECREF(py_code);
3891 PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "
3892 "isn't a 2-tuple of strings", code);
3893 return -1;
3894 }
3895 /* Load the object. */
3896 obj = find_class(module_name, class_name, self->find_class);
3897 if (obj == NULL) {
3898 Py_DECREF(py_code);
3899 return -1;
3900 }
3901 /* Cache code -> obj. */
3902 code = PyDict_SetItem(extension_cache, py_code, obj);
3903 Py_DECREF(py_code);
3904 if (code < 0) {
3905 Py_DECREF(obj);
3906 return -1;
3907 }
3908 PDATA_PUSH(self->stack, obj, -1);
3909 return 0;
3910}
Guido van Rossum60456fd1997-04-09 17:36:32 +00003911
3912static int
Tim Peterscba30e22003-02-01 06:24:36 +00003913load_put(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003914{
3915 PyObject *py_str = 0, *value = 0;
3916 int len, l;
3917 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003918
Tim Peters0bc93f52003-02-02 18:29:33 +00003919 if ((l = self->readline_func(self, &s)) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003920 if (l < 2) return bad_readline();
3921 if (!( len=self->stack->length )) return stackUnderflow();
3922 if (!( py_str = PyString_FromStringAndSize(s, l - 1))) return -1;
3923 value=self->stack->data[len-1];
3924 l=PyDict_SetItem(self->memo, py_str, value);
3925 Py_DECREF(py_str);
3926 return l;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003927}
3928
3929
3930static int
Tim Peterscba30e22003-02-01 06:24:36 +00003931load_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003932{
3933 PyObject *py_key = 0, *value = 0;
3934 unsigned char key;
3935 char *s;
3936 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003937
Tim Peters0bc93f52003-02-02 18:29:33 +00003938 if (self->read_func(self, &s, 1) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003939 if (!( (len=self->stack->length) > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003940
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003941 key = (unsigned char)s[0];
Guido van Rossum053b8df1998-11-25 16:18:00 +00003942
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003943 if (!( py_key = PyInt_FromLong((long)key))) return -1;
3944 value=self->stack->data[len-1];
3945 len=PyDict_SetItem(self->memo, py_key, value);
3946 Py_DECREF(py_key);
3947 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003948}
3949
3950
3951static int
Tim Peterscba30e22003-02-01 06:24:36 +00003952load_long_binput(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003953{
3954 PyObject *py_key = 0, *value = 0;
3955 long key;
3956 unsigned char c;
3957 char *s;
3958 int len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003959
Tim Peters0bc93f52003-02-02 18:29:33 +00003960 if (self->read_func(self, &s, 4) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003961 if (!( len=self->stack->length )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00003962
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003963 c = (unsigned char)s[0];
3964 key = (long)c;
3965 c = (unsigned char)s[1];
3966 key |= (long)c << 8;
3967 c = (unsigned char)s[2];
3968 key |= (long)c << 16;
3969 c = (unsigned char)s[3];
3970 key |= (long)c << 24;
Tim Peters84e87f32001-03-17 04:50:51 +00003971
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003972 if (!( py_key = PyInt_FromLong(key))) return -1;
3973 value=self->stack->data[len-1];
3974 len=PyDict_SetItem(self->memo, py_key, value);
3975 Py_DECREF(py_key);
3976 return len;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003977}
3978
3979
3980static int
Tim Peterscba30e22003-02-01 06:24:36 +00003981do_append(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003982{
3983 PyObject *value = 0, *list = 0, *append_method = 0;
3984 int len, i;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003985
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003986 len=self->stack->length;
3987 if (!( len >= x && x > 0 )) return stackUnderflow();
3988 /* nothing to do */
Tim Peterscba30e22003-02-01 06:24:36 +00003989 if (len==x) return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00003990
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003991 list=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00003992
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003993 if (PyList_Check(list)) {
3994 PyObject *slice;
3995 int list_len;
Tim Peters84e87f32001-03-17 04:50:51 +00003996
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003997 slice=Pdata_popList(self->stack, x);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003998 if (! slice) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00003999 list_len = PyList_GET_SIZE(list);
4000 i=PyList_SetSlice(list, list_len, list_len, slice);
4001 Py_DECREF(slice);
4002 return i;
4003 }
4004 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00004005
Tim Peterscba30e22003-02-01 06:24:36 +00004006 if (!( append_method = PyObject_GetAttr(list, append_str)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004007 return -1;
4008
4009 for (i = x; i < len; i++) {
4010 PyObject *junk;
4011
4012 value=self->stack->data[i];
4013 junk=0;
4014 ARG_TUP(self, value);
4015 if (self->arg) {
Tim Peterscba30e22003-02-01 06:24:36 +00004016 junk = PyObject_Call(append_method, self->arg,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004017 NULL);
4018 FREE_ARG_TUP(self);
4019 }
4020 if (! junk) {
4021 Pdata_clear(self->stack, i+1);
4022 self->stack->length=x;
4023 Py_DECREF(append_method);
4024 return -1;
4025 }
4026 Py_DECREF(junk);
4027 }
4028 self->stack->length=x;
4029 Py_DECREF(append_method);
4030 }
4031
4032 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004033}
4034
4035
4036static int
Tim Peterscba30e22003-02-01 06:24:36 +00004037load_append(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004038{
4039 return do_append(self, self->stack->length - 1);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004040}
4041
4042
4043static int
Tim Peterscba30e22003-02-01 06:24:36 +00004044load_appends(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004045{
4046 return do_append(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004047}
4048
4049
4050static int
Tim Peterscba30e22003-02-01 06:24:36 +00004051do_setitems(Unpicklerobject *self, int x)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004052{
4053 PyObject *value = 0, *key = 0, *dict = 0;
4054 int len, i, r=0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004055
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004056 if (!( (len=self->stack->length) >= x
4057 && x > 0 )) return stackUnderflow();
Guido van Rossum60456fd1997-04-09 17:36:32 +00004058
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004059 dict=self->stack->data[x-1];
Guido van Rossum60456fd1997-04-09 17:36:32 +00004060
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004061 for (i = x+1; i < len; i += 2) {
4062 key =self->stack->data[i-1];
4063 value=self->stack->data[i ];
4064 if (PyObject_SetItem(dict, key, value) < 0) {
4065 r=-1;
4066 break;
4067 }
4068 }
4069
4070 Pdata_clear(self->stack, x);
4071
4072 return r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004073}
4074
4075
Tim Peters84e87f32001-03-17 04:50:51 +00004076static int
Tim Peterscba30e22003-02-01 06:24:36 +00004077load_setitem(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004078{
4079 return do_setitems(self, self->stack->length - 2);
4080}
Guido van Rossum60456fd1997-04-09 17:36:32 +00004081
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004082static int
Tim Peterscba30e22003-02-01 06:24:36 +00004083load_setitems(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004084{
4085 return do_setitems(self, marker(self));
Guido van Rossum60456fd1997-04-09 17:36:32 +00004086}
4087
Tim Peters84e87f32001-03-17 04:50:51 +00004088
Guido van Rossum60456fd1997-04-09 17:36:32 +00004089static int
Tim Peterscba30e22003-02-01 06:24:36 +00004090load_build(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004091{
Tim Peters080c88b2003-02-15 03:01:11 +00004092 PyObject *state, *inst, *slotstate;
4093 PyObject *__setstate__;
4094 PyObject *d_key, *d_value;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004095 Py_ssize_t i;
Tim Peters080c88b2003-02-15 03:01:11 +00004096 int res = -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004097
Tim Peters080c88b2003-02-15 03:01:11 +00004098 /* Stack is ... instance, state. We want to leave instance at
4099 * the stack top, possibly mutated via instance.__setstate__(state).
4100 */
4101 if (self->stack->length < 2)
4102 return stackUnderflow();
4103 PDATA_POP(self->stack, state);
4104 if (state == NULL)
4105 return -1;
4106 inst = self->stack->data[self->stack->length - 1];
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004107
Tim Peters080c88b2003-02-15 03:01:11 +00004108 __setstate__ = PyObject_GetAttr(inst, __setstate___str);
4109 if (__setstate__ != NULL) {
4110 PyObject *junk = NULL;
4111
4112 /* The explicit __setstate__ is responsible for everything. */
4113 ARG_TUP(self, state);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004114 if (self->arg) {
4115 junk = PyObject_Call(__setstate__, self->arg, NULL);
4116 FREE_ARG_TUP(self);
4117 }
4118 Py_DECREF(__setstate__);
Tim Peters080c88b2003-02-15 03:01:11 +00004119 if (junk == NULL)
4120 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004121 Py_DECREF(junk);
4122 return 0;
4123 }
Jeremy Hyltonf00368f2003-06-16 20:19:49 +00004124 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
4125 return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004126 PyErr_Clear();
Tim Peters080c88b2003-02-15 03:01:11 +00004127
4128 /* A default __setstate__. First see whether state embeds a
4129 * slot state dict too (a proto 2 addition).
4130 */
4131 if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {
4132 PyObject *temp = state;
4133 state = PyTuple_GET_ITEM(temp, 0);
4134 slotstate = PyTuple_GET_ITEM(temp, 1);
4135 Py_INCREF(state);
4136 Py_INCREF(slotstate);
4137 Py_DECREF(temp);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004138 }
Tim Peters080c88b2003-02-15 03:01:11 +00004139 else
4140 slotstate = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004141
Tim Peters080c88b2003-02-15 03:01:11 +00004142 /* Set inst.__dict__ from the state dict (if any). */
4143 if (state != Py_None) {
4144 PyObject *dict;
4145 if (! PyDict_Check(state)) {
4146 PyErr_SetString(UnpicklingError, "state is not a "
4147 "dictionary");
4148 goto finally;
4149 }
4150 dict = PyObject_GetAttr(inst, __dict___str);
4151 if (dict == NULL)
4152 goto finally;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004153
Tim Peters080c88b2003-02-15 03:01:11 +00004154 i = 0;
4155 while (PyDict_Next(state, &i, &d_key, &d_value)) {
4156 if (PyObject_SetItem(dict, d_key, d_value) < 0)
4157 goto finally;
4158 }
4159 Py_DECREF(dict);
4160 }
4161
4162 /* Also set instance attributes from the slotstate dict (if any). */
4163 if (slotstate != NULL) {
4164 if (! PyDict_Check(slotstate)) {
4165 PyErr_SetString(UnpicklingError, "slot state is not "
4166 "a dictionary");
4167 goto finally;
4168 }
4169 i = 0;
4170 while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {
4171 if (PyObject_SetAttr(inst, d_key, d_value) < 0)
4172 goto finally;
4173 }
4174 }
4175 res = 0;
4176
4177 finally:
4178 Py_DECREF(state);
4179 Py_XDECREF(slotstate);
4180 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004181}
4182
4183
4184static int
Tim Peterscba30e22003-02-01 06:24:36 +00004185load_mark(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004186{
4187 int s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004188
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004189 /* Note that we split the (pickle.py) stack into two stacks, an
4190 object stack and a mark stack. Here we push a mark onto the
4191 mark stack.
4192 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00004193
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004194 if ((self->num_marks + 1) >= self->marks_size) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00004195 int *marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004196 s=self->marks_size+20;
4197 if (s <= self->num_marks) s=self->num_marks + 1;
4198 if (self->marks == NULL)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004199 marks=(int *)malloc(s * sizeof(int));
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004200 else
Guido van Rossumd8faa362007-04-27 19:54:29 +00004201 marks=(int *)realloc(self->marks,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004202 s * sizeof(int));
Guido van Rossumd8faa362007-04-27 19:54:29 +00004203 if (!marks) {
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004204 PyErr_NoMemory();
4205 return -1;
4206 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00004207 self->marks = marks;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004208 self->marks_size = s;
4209 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004210
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004211 self->marks[self->num_marks++] = self->stack->length;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004212
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004213 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004214}
4215
Guido van Rossum60456fd1997-04-09 17:36:32 +00004216static int
Tim Peterscba30e22003-02-01 06:24:36 +00004217load_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004218{
4219 PyObject *callable = 0, *arg_tup = 0, *ob = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004220
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004221 PDATA_POP(self->stack, arg_tup);
4222 if (! arg_tup) return -1;
4223 PDATA_POP(self->stack, callable);
Guido van Rossum512ab9f2006-08-17 22:28:49 +00004224 if (callable) {
4225 ob = Instance_New(callable, arg_tup);
4226 Py_DECREF(callable);
4227 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004228 Py_DECREF(arg_tup);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004229
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004230 if (! ob) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004231
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004232 PDATA_PUSH(self->stack, ob, -1);
4233 return 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004234}
Tim Peters84e87f32001-03-17 04:50:51 +00004235
Tim Peters4190fb82003-02-02 16:09:05 +00004236/* Just raises an error if we don't know the protocol specified. PROTO
4237 * is the first opcode for protocols >= 2.
4238 */
4239static int
4240load_proto(Unpicklerobject *self)
4241{
4242 int i;
4243 char *protobyte;
4244
4245 i = self->read_func(self, &protobyte, 1);
4246 if (i < 0)
4247 return -1;
4248
4249 i = calc_binint(protobyte, 1);
4250 /* No point checking for < 0, since calc_binint returns an unsigned
4251 * int when chewing on 1 byte.
4252 */
4253 assert(i >= 0);
Tim Peters8587b3c2003-02-13 15:44:41 +00004254 if (i <= HIGHEST_PROTOCOL)
Tim Peters4190fb82003-02-02 16:09:05 +00004255 return 0;
4256
4257 PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);
4258 return -1;
4259}
4260
Guido van Rossum60456fd1997-04-09 17:36:32 +00004261static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004262load(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004263{
4264 PyObject *err = 0, *val = 0;
4265 char *s;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004266
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004267 self->num_marks = 0;
4268 if (self->stack->length) Pdata_clear(self->stack, 0);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004269
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004270 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004271 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004272 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004273
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004274 switch (s[0]) {
4275 case NONE:
4276 if (load_none(self) < 0)
4277 break;
4278 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004279
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004280 case BININT:
4281 if (load_binint(self) < 0)
4282 break;
4283 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004284
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004285 case BININT1:
4286 if (load_binint1(self) < 0)
4287 break;
4288 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004289
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004290 case BININT2:
4291 if (load_binint2(self) < 0)
4292 break;
4293 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004294
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004295 case INT:
4296 if (load_int(self) < 0)
4297 break;
4298 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004299
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004300 case LONG:
4301 if (load_long(self) < 0)
4302 break;
4303 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004304
Tim Petersee1a53c2003-02-02 02:57:53 +00004305 case LONG1:
4306 if (load_counted_long(self, 1) < 0)
4307 break;
4308 continue;
4309
4310 case LONG4:
4311 if (load_counted_long(self, 4) < 0)
4312 break;
4313 continue;
4314
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004315 case FLOAT:
4316 if (load_float(self) < 0)
4317 break;
4318 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004319
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004320 case BINFLOAT:
4321 if (load_binfloat(self) < 0)
4322 break;
4323 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004324
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004325 case BINSTRING:
4326 if (load_binstring(self) < 0)
4327 break;
4328 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004329
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004330 case SHORT_BINSTRING:
4331 if (load_short_binstring(self) < 0)
4332 break;
4333 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004334
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004335 case STRING:
4336 if (load_string(self) < 0)
4337 break;
4338 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004339
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004340 case UNICODE:
4341 if (load_unicode(self) < 0)
4342 break;
4343 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004344
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004345 case BINUNICODE:
4346 if (load_binunicode(self) < 0)
4347 break;
4348 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004349
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004350 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004351 if (load_counted_tuple(self, 0) < 0)
4352 break;
4353 continue;
4354
4355 case TUPLE1:
4356 if (load_counted_tuple(self, 1) < 0)
4357 break;
4358 continue;
4359
4360 case TUPLE2:
4361 if (load_counted_tuple(self, 2) < 0)
4362 break;
4363 continue;
4364
4365 case TUPLE3:
4366 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004367 break;
4368 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004369
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004370 case TUPLE:
4371 if (load_tuple(self) < 0)
4372 break;
4373 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004374
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004375 case EMPTY_LIST:
4376 if (load_empty_list(self) < 0)
4377 break;
4378 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004379
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004380 case LIST:
4381 if (load_list(self) < 0)
4382 break;
4383 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004384
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004385 case EMPTY_DICT:
4386 if (load_empty_dict(self) < 0)
4387 break;
4388 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004389
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004390 case DICT:
4391 if (load_dict(self) < 0)
4392 break;
4393 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004394
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004395 case OBJ:
4396 if (load_obj(self) < 0)
4397 break;
4398 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004399
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004400 case INST:
4401 if (load_inst(self) < 0)
4402 break;
4403 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004404
Tim Peterseab7db32003-02-13 18:24:14 +00004405 case NEWOBJ:
4406 if (load_newobj(self) < 0)
4407 break;
4408 continue;
4409
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004410 case GLOBAL:
4411 if (load_global(self) < 0)
4412 break;
4413 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004414
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004415 case APPEND:
4416 if (load_append(self) < 0)
4417 break;
4418 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004419
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004420 case APPENDS:
4421 if (load_appends(self) < 0)
4422 break;
4423 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004424
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004425 case BUILD:
4426 if (load_build(self) < 0)
4427 break;
4428 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004429
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004430 case DUP:
4431 if (load_dup(self) < 0)
4432 break;
4433 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004434
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004435 case BINGET:
4436 if (load_binget(self) < 0)
4437 break;
4438 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004439
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004440 case LONG_BINGET:
4441 if (load_long_binget(self) < 0)
4442 break;
4443 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004444
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004445 case GET:
4446 if (load_get(self) < 0)
4447 break;
4448 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004449
Tim Peters2d629652003-02-04 05:06:17 +00004450 case EXT1:
4451 if (load_extension(self, 1) < 0)
4452 break;
4453 continue;
4454
4455 case EXT2:
4456 if (load_extension(self, 2) < 0)
4457 break;
4458 continue;
4459
4460 case EXT4:
4461 if (load_extension(self, 4) < 0)
4462 break;
4463 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004464 case MARK:
4465 if (load_mark(self) < 0)
4466 break;
4467 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004468
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004469 case BINPUT:
4470 if (load_binput(self) < 0)
4471 break;
4472 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004473
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004474 case LONG_BINPUT:
4475 if (load_long_binput(self) < 0)
4476 break;
4477 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004478
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004479 case PUT:
4480 if (load_put(self) < 0)
4481 break;
4482 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004483
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004484 case POP:
4485 if (load_pop(self) < 0)
4486 break;
4487 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004488
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004489 case POP_MARK:
4490 if (load_pop_mark(self) < 0)
4491 break;
4492 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004493
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004494 case SETITEM:
4495 if (load_setitem(self) < 0)
4496 break;
4497 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004498
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004499 case SETITEMS:
4500 if (load_setitems(self) < 0)
4501 break;
4502 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004503
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004504 case STOP:
4505 break;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004506
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004507 case PERSID:
4508 if (load_persid(self) < 0)
4509 break;
4510 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004511
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004512 case BINPERSID:
4513 if (load_binpersid(self) < 0)
4514 break;
4515 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004516
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004517 case REDUCE:
4518 if (load_reduce(self) < 0)
4519 break;
4520 continue;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004521
Tim Peters4190fb82003-02-02 16:09:05 +00004522 case PROTO:
4523 if (load_proto(self) < 0)
4524 break;
4525 continue;
4526
Tim Peters3c67d792003-02-02 17:59:11 +00004527 case NEWTRUE:
4528 if (load_bool(self, Py_True) < 0)
4529 break;
4530 continue;
4531
4532 case NEWFALSE:
4533 if (load_bool(self, Py_False) < 0)
4534 break;
4535 continue;
4536
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004537 case '\0':
4538 /* end of file */
4539 PyErr_SetNone(PyExc_EOFError);
4540 break;
Tim Peterscba30e22003-02-01 06:24:36 +00004541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004542 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004543 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004544 "invalid load key, '%s'.",
4545 "c", s[0]);
4546 return NULL;
4547 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004549 break;
4550 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004551
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004552 if ((err = PyErr_Occurred())) {
4553 if (err == PyExc_EOFError) {
4554 PyErr_SetNone(PyExc_EOFError);
4555 }
4556 return NULL;
4557 }
Guido van Rossum60456fd1997-04-09 17:36:32 +00004558
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004559 PDATA_POP(self->stack, val);
4560 return val;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004561}
Tim Peters84e87f32001-03-17 04:50:51 +00004562
Guido van Rossum60456fd1997-04-09 17:36:32 +00004563
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004564/* No-load functions to support noload, which is used to
4565 find persistent references. */
4566
4567static int
Tim Peterscba30e22003-02-01 06:24:36 +00004568noload_obj(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004569{
4570 int i;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004571
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004572 if ((i = marker(self)) < 0) return -1;
4573 return Pdata_clear(self->stack, i+1);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004574}
4575
4576
4577static int
Tim Peterscba30e22003-02-01 06:24:36 +00004578noload_inst(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004579{
4580 int i;
4581 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004582
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004583 if ((i = marker(self)) < 0) return -1;
4584 Pdata_clear(self->stack, i);
Tim Peters0bc93f52003-02-02 18:29:33 +00004585 if (self->readline_func(self, &s) < 0) return -1;
4586 if (self->readline_func(self, &s) < 0) return -1;
Tim Peterseab7db32003-02-13 18:24:14 +00004587 PDATA_APPEND(self->stack, Py_None, -1);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004588 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004589}
4590
4591static int
Tim Peterseab7db32003-02-13 18:24:14 +00004592noload_newobj(Unpicklerobject *self)
4593{
4594 PyObject *obj;
4595
4596 PDATA_POP(self->stack, obj); /* pop argtuple */
4597 if (obj == NULL) return -1;
4598 Py_DECREF(obj);
4599
4600 PDATA_POP(self->stack, obj); /* pop cls */
4601 if (obj == NULL) return -1;
4602 Py_DECREF(obj);
4603
4604 PDATA_APPEND(self->stack, Py_None, -1);
4605 return 0;
4606}
4607
4608static int
Tim Peterscba30e22003-02-01 06:24:36 +00004609noload_global(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004610{
4611 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004612
Tim Peters0bc93f52003-02-02 18:29:33 +00004613 if (self->readline_func(self, &s) < 0) return -1;
4614 if (self->readline_func(self, &s) < 0) return -1;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004615 PDATA_APPEND(self->stack, Py_None,-1);
4616 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004617}
4618
4619static int
Tim Peterscba30e22003-02-01 06:24:36 +00004620noload_reduce(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004621{
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004622
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004623 if (self->stack->length < 2) return stackUnderflow();
4624 Pdata_clear(self->stack, self->stack->length-2);
4625 PDATA_APPEND(self->stack, Py_None,-1);
4626 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004627}
4628
4629static int
4630noload_build(Unpicklerobject *self) {
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004631
Guido van Rossum053b8df1998-11-25 16:18:00 +00004632 if (self->stack->length < 1) return stackUnderflow();
4633 Pdata_clear(self->stack, self->stack->length-1);
Guido van Rossum50f385c1998-12-04 18:48:44 +00004634 return 0;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004635}
4636
Tim Peters2d629652003-02-04 05:06:17 +00004637static int
4638noload_extension(Unpicklerobject *self, int nbytes)
4639{
4640 char *codebytes;
4641
4642 assert(nbytes == 1 || nbytes == 2 || nbytes == 4);
4643 if (self->read_func(self, &codebytes, nbytes) < 0) return -1;
4644 PDATA_APPEND(self->stack, Py_None, -1);
4645 return 0;
4646}
4647
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004648
4649static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00004650noload(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004651{
4652 PyObject *err = 0, *val = 0;
4653 char *s;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004654
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004655 self->num_marks = 0;
4656 Pdata_clear(self->stack, 0);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004657
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004658 while (1) {
Tim Peters0bc93f52003-02-02 18:29:33 +00004659 if (self->read_func(self, &s, 1) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004660 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004661
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004662 switch (s[0]) {
4663 case NONE:
4664 if (load_none(self) < 0)
4665 break;
4666 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004667
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004668 case BININT:
4669 if (load_binint(self) < 0)
4670 break;
4671 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004672
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004673 case BININT1:
4674 if (load_binint1(self) < 0)
4675 break;
4676 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004677
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004678 case BININT2:
4679 if (load_binint2(self) < 0)
4680 break;
4681 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004682
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004683 case INT:
4684 if (load_int(self) < 0)
4685 break;
4686 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004687
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004688 case LONG:
4689 if (load_long(self) < 0)
4690 break;
4691 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004692
Tim Peters4190fb82003-02-02 16:09:05 +00004693 case LONG1:
4694 if (load_counted_long(self, 1) < 0)
4695 break;
4696 continue;
4697
4698 case LONG4:
4699 if (load_counted_long(self, 4) < 0)
4700 break;
4701 continue;
4702
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004703 case FLOAT:
4704 if (load_float(self) < 0)
4705 break;
4706 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004707
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004708 case BINFLOAT:
4709 if (load_binfloat(self) < 0)
4710 break;
4711 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004712
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004713 case BINSTRING:
4714 if (load_binstring(self) < 0)
4715 break;
4716 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004717
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004718 case SHORT_BINSTRING:
4719 if (load_short_binstring(self) < 0)
4720 break;
4721 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004722
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004723 case STRING:
4724 if (load_string(self) < 0)
4725 break;
4726 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004727
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004728 case UNICODE:
4729 if (load_unicode(self) < 0)
4730 break;
4731 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004732
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004733 case BINUNICODE:
4734 if (load_binunicode(self) < 0)
4735 break;
4736 continue;
Guido van Rossum5fccb7c2000-03-10 23:11:40 +00004737
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004738 case EMPTY_TUPLE:
Tim Peters1d63c9f2003-02-02 20:29:39 +00004739 if (load_counted_tuple(self, 0) < 0)
4740 break;
4741 continue;
4742
4743 case TUPLE1:
4744 if (load_counted_tuple(self, 1) < 0)
4745 break;
4746 continue;
4747
4748 case TUPLE2:
4749 if (load_counted_tuple(self, 2) < 0)
4750 break;
4751 continue;
4752
4753 case TUPLE3:
4754 if (load_counted_tuple(self, 3) < 0)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004755 break;
4756 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004757
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004758 case TUPLE:
4759 if (load_tuple(self) < 0)
4760 break;
4761 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004762
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004763 case EMPTY_LIST:
4764 if (load_empty_list(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 LIST:
4769 if (load_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 EMPTY_DICT:
4774 if (load_empty_dict(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 DICT:
4779 if (load_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 OBJ:
4784 if (noload_obj(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 INST:
4789 if (noload_inst(self) < 0)
4790 break;
4791 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004792
Tim Peterseab7db32003-02-13 18:24:14 +00004793 case NEWOBJ:
4794 if (noload_newobj(self) < 0)
4795 break;
4796 continue;
4797
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004798 case GLOBAL:
4799 if (noload_global(self) < 0)
4800 break;
4801 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004802
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004803 case APPEND:
4804 if (load_append(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 APPENDS:
4809 if (load_appends(self) < 0)
4810 break;
4811 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004812
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004813 case BUILD:
4814 if (noload_build(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 DUP:
4819 if (load_dup(self) < 0)
4820 break;
4821 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004822
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004823 case BINGET:
4824 if (load_binget(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 LONG_BINGET:
4829 if (load_long_binget(self) < 0)
4830 break;
4831 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004832
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004833 case GET:
4834 if (load_get(self) < 0)
4835 break;
4836 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004837
Tim Peters2d629652003-02-04 05:06:17 +00004838 case EXT1:
4839 if (noload_extension(self, 1) < 0)
4840 break;
4841 continue;
4842
4843 case EXT2:
4844 if (noload_extension(self, 2) < 0)
4845 break;
4846 continue;
4847
4848 case EXT4:
4849 if (noload_extension(self, 4) < 0)
4850 break;
4851 continue;
4852
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004853 case MARK:
4854 if (load_mark(self) < 0)
4855 break;
4856 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004857
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004858 case BINPUT:
4859 if (load_binput(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 LONG_BINPUT:
4864 if (load_long_binput(self) < 0)
4865 break;
4866 continue;
Tim Peters84e87f32001-03-17 04:50:51 +00004867
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004868 case PUT:
4869 if (load_put(self) < 0)
4870 break;
4871 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004872
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004873 case POP:
4874 if (load_pop(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_MARK:
4879 if (load_pop_mark(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 SETITEM:
4884 if (load_setitem(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 SETITEMS:
4889 if (load_setitems(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 STOP:
4894 break;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004895
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004896 case PERSID:
4897 if (load_persid(self) < 0)
4898 break;
4899 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004900
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004901 case BINPERSID:
4902 if (load_binpersid(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 REDUCE:
4907 if (noload_reduce(self) < 0)
4908 break;
4909 continue;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004910
Tim Peters4190fb82003-02-02 16:09:05 +00004911 case PROTO:
4912 if (load_proto(self) < 0)
4913 break;
4914 continue;
4915
Tim Peters3c67d792003-02-02 17:59:11 +00004916 case NEWTRUE:
4917 if (load_bool(self, Py_True) < 0)
4918 break;
4919 continue;
4920
4921 case NEWFALSE:
4922 if (load_bool(self, Py_False) < 0)
4923 break;
4924 continue;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004925 default:
Tim Peterscba30e22003-02-01 06:24:36 +00004926 cPickle_ErrFormat(UnpicklingError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004927 "invalid load key, '%s'.",
4928 "c", s[0]);
4929 return NULL;
4930 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004931
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004932 break;
4933 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004934
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004935 if ((err = PyErr_Occurred())) {
4936 if (err == PyExc_EOFError) {
4937 PyErr_SetNone(PyExc_EOFError);
4938 }
4939 return NULL;
4940 }
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004941
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004942 PDATA_POP(self->stack, val);
4943 return val;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004944}
Tim Peters84e87f32001-03-17 04:50:51 +00004945
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004946
Guido van Rossum60456fd1997-04-09 17:36:32 +00004947static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004948Unpickler_load(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004949{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004950 return load(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00004951}
4952
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004953static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004954Unpickler_noload(Unpicklerobject *self, PyObject *unused)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004955{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004956 return noload(self);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004957}
4958
Guido van Rossum60456fd1997-04-09 17:36:32 +00004959
4960static struct PyMethodDef Unpickler_methods[] = {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004961 {"load", (PyCFunction)Unpickler_load, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004962 PyDoc_STR("load() -- Load a pickle")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004963 },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004964 {"noload", (PyCFunction)Unpickler_noload, METH_NOARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00004965 PyDoc_STR(
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004966 "noload() -- not load a pickle, but go through most of the motions\n"
4967 "\n"
4968 "This function can be used to read past a pickle without instantiating\n"
4969 "any objects or importing any modules. It can also be used to find all\n"
4970 "persistent references without instantiating any objects or importing\n"
Neal Norwitz200788c2002-08-13 22:20:41 +00004971 "any modules.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00004972 },
Guido van Rossum60456fd1997-04-09 17:36:32 +00004973 {NULL, NULL} /* sentinel */
4974};
4975
4976
4977static Unpicklerobject *
Tim Peterscba30e22003-02-01 06:24:36 +00004978newUnpicklerobject(PyObject *f)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004979{
4980 Unpicklerobject *self;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004981
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00004982 if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004983 return NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004984
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004985 self->file = NULL;
4986 self->arg = NULL;
4987 self->stack = (Pdata*)Pdata_New();
4988 self->pers_func = NULL;
4989 self->last_string = NULL;
4990 self->marks = NULL;
4991 self->num_marks = 0;
4992 self->marks_size = 0;
4993 self->buf_size = 0;
4994 self->read = NULL;
4995 self->readline = NULL;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004996 self->find_class = NULL;
Guido van Rossum60456fd1997-04-09 17:36:32 +00004997
Tim Peterscba30e22003-02-01 06:24:36 +00004998 if (!( self->memo = PyDict_New()))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00004999 goto err;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005000
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005001 if (!self->stack)
5002 goto err;
5003
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005004 Py_INCREF(f);
5005 self->file = f;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005006
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005007 /* Set read, readline based on type of f */
5008 if (PyFile_Check(f)) {
5009 self->fp = PyFile_AsFile(f);
5010 if (self->fp == NULL) {
Tim Peterscba30e22003-02-01 06:24:36 +00005011 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005012 "I/O operation on closed file");
5013 goto err;
5014 }
5015 self->read_func = read_file;
5016 self->readline_func = readline_file;
Guido van Rossumc91fcaa1999-03-29 20:00:14 +00005017 }
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005018 else if (PycStringIO_InputCheck(f)) {
5019 self->fp = NULL;
5020 self->read_func = read_cStringIO;
5021 self->readline_func = readline_cStringIO;
5022 }
5023 else {
Guido van Rossum60456fd1997-04-09 17:36:32 +00005024
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005025 self->fp = NULL;
5026 self->read_func = read_other;
5027 self->readline_func = readline_other;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005028
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005029 if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&
5030 (self->read = PyObject_GetAttr(f, read_str)))) {
5031 PyErr_Clear();
Tim Peterscba30e22003-02-01 06:24:36 +00005032 PyErr_SetString( PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005033 "argument must have 'read' and "
5034 "'readline' attributes" );
5035 goto err;
5036 }
5037 }
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005038 PyObject_GC_Track(self);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005039
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005040 return self;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005041
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005042 err:
5043 Py_DECREF((PyObject *)self);
5044 return NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005045}
5046
5047
5048static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005049get_Unpickler(PyObject *self, PyObject *file)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005050{
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005051 return (PyObject *)newUnpicklerobject(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005052}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005053
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005054
Guido van Rossum60456fd1997-04-09 17:36:32 +00005055static void
Tim Peterscba30e22003-02-01 06:24:36 +00005056Unpickler_dealloc(Unpicklerobject *self)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005057{
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005058 PyObject_GC_UnTrack((PyObject *)self);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005059 Py_XDECREF(self->readline);
5060 Py_XDECREF(self->read);
5061 Py_XDECREF(self->file);
5062 Py_XDECREF(self->memo);
5063 Py_XDECREF(self->stack);
5064 Py_XDECREF(self->pers_func);
5065 Py_XDECREF(self->arg);
5066 Py_XDECREF(self->last_string);
Jeremy Hyltonfff093f2003-07-11 19:42:49 +00005067 Py_XDECREF(self->find_class);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005068
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005069 if (self->marks) {
5070 free(self->marks);
5071 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005072
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005073 if (self->buf_size) {
5074 free(self->buf);
5075 }
Tim Peters84e87f32001-03-17 04:50:51 +00005076
Tim Peters3cfe7542003-05-21 21:29:48 +00005077 self->ob_type->tp_free((PyObject *)self);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005078}
5079
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005080static int
5081Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
5082{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005083 Py_VISIT(self->readline);
5084 Py_VISIT(self->read);
5085 Py_VISIT(self->file);
5086 Py_VISIT(self->memo);
5087 Py_VISIT(self->stack);
5088 Py_VISIT(self->pers_func);
5089 Py_VISIT(self->arg);
5090 Py_VISIT(self->last_string);
5091 Py_VISIT(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005092 return 0;
5093}
5094
5095static int
5096Unpickler_clear(Unpicklerobject *self)
5097{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005098 Py_CLEAR(self->readline);
5099 Py_CLEAR(self->read);
5100 Py_CLEAR(self->file);
5101 Py_CLEAR(self->memo);
5102 Py_CLEAR(self->stack);
5103 Py_CLEAR(self->pers_func);
5104 Py_CLEAR(self->arg);
5105 Py_CLEAR(self->last_string);
5106 Py_CLEAR(self->find_class);
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005107 return 0;
5108}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005109
5110static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005111Unpickler_getattr(Unpicklerobject *self, char *name)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005112{
5113 if (!strcmp(name, "persistent_load")) {
5114 if (!self->pers_func) {
5115 PyErr_SetString(PyExc_AttributeError, name);
5116 return NULL;
5117 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005118
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005119 Py_INCREF(self->pers_func);
5120 return self->pers_func;
5121 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005122
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005123 if (!strcmp(name, "find_global")) {
5124 if (!self->find_class) {
5125 PyErr_SetString(PyExc_AttributeError, name);
5126 return NULL;
5127 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005128
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005129 Py_INCREF(self->find_class);
5130 return self->find_class;
5131 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005132
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005133 if (!strcmp(name, "memo")) {
5134 if (!self->memo) {
5135 PyErr_SetString(PyExc_AttributeError, name);
5136 return NULL;
5137 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005138
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005139 Py_INCREF(self->memo);
5140 return self->memo;
5141 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005142
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005143 if (!strcmp(name, "UnpicklingError")) {
5144 Py_INCREF(UnpicklingError);
5145 return UnpicklingError;
5146 }
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005147
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005148 return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005149}
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005150
Guido van Rossum60456fd1997-04-09 17:36:32 +00005151
5152static int
Tim Peterscba30e22003-02-01 06:24:36 +00005153Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005154{
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005155
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005156 if (!strcmp(name, "persistent_load")) {
5157 Py_XDECREF(self->pers_func);
5158 self->pers_func = value;
5159 Py_XINCREF(value);
5160 return 0;
5161 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005162
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005163 if (!strcmp(name, "find_global")) {
5164 Py_XDECREF(self->find_class);
5165 self->find_class = value;
5166 Py_XINCREF(value);
5167 return 0;
5168 }
Guido van Rossum1b9e0aa1999-04-19 17:58:18 +00005169
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005170 if (! value) {
5171 PyErr_SetString(PyExc_TypeError,
5172 "attribute deletion is not supported");
5173 return -1;
5174 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005175
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005176 if (strcmp(name, "memo") == 0) {
5177 if (!PyDict_Check(value)) {
Tim Peterscba30e22003-02-01 06:24:36 +00005178 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005179 "memo must be a dictionary");
5180 return -1;
5181 }
5182 Py_XDECREF(self->memo);
5183 self->memo = value;
5184 Py_INCREF(value);
5185 return 0;
5186 }
Jeremy Hyltonce616e41998-08-13 23:13:52 +00005187
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005188 PyErr_SetString(PyExc_AttributeError, name);
5189 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005190}
5191
Tim Peters5bd2a792003-02-01 16:45:06 +00005192/* ---------------------------------------------------------------------------
5193 * Module-level functions.
5194 */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005195
Martin v. Löwis544f1192004-07-27 05:22:33 +00005196/* dump(obj, file, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005197static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005198cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005199{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005200 static char *kwlist[] = {"obj", "file", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005201 PyObject *ob, *file, *res = NULL;
5202 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005203 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005204
Martin v. Löwis544f1192004-07-27 05:22:33 +00005205 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,
5206 &ob, &file, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005207 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005208
Tim Peters5bd2a792003-02-01 16:45:06 +00005209 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005210 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005211
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005212 if (dump(pickler, ob) < 0)
5213 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005214
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005215 Py_INCREF(Py_None);
5216 res = Py_None;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005217
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005218 finally:
5219 Py_XDECREF(pickler);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005220
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005221 return res;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005222}
5223
5224
Martin v. Löwis544f1192004-07-27 05:22:33 +00005225/* dumps(obj, protocol=0). */
Guido van Rossum60456fd1997-04-09 17:36:32 +00005226static PyObject *
Martin v. Löwis544f1192004-07-27 05:22:33 +00005227cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005228{
Martin v. Löwis15e62742006-02-27 16:46:16 +00005229 static char *kwlist[] = {"obj", "protocol", NULL};
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005230 PyObject *ob, *file = 0, *res = NULL;
5231 Picklerobject *pickler = 0;
Tim Peters5bd2a792003-02-01 16:45:06 +00005232 int proto = 0;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005233
Martin v. Löwis544f1192004-07-27 05:22:33 +00005234 if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,
5235 &ob, &proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005236 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005237
Tim Peterscba30e22003-02-01 06:24:36 +00005238 if (!( file = PycStringIO->NewOutput(128)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005239 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005240
Tim Peters5bd2a792003-02-01 16:45:06 +00005241 if (!( pickler = newPicklerobject(file, proto)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005242 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005243
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005244 if (dump(pickler, ob) < 0)
5245 goto finally;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005246
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005247 res = PycStringIO->cgetvalue(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005248
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005249 finally:
5250 Py_XDECREF(pickler);
5251 Py_XDECREF(file);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005252
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005253 return res;
Tim Peters84e87f32001-03-17 04:50:51 +00005254}
5255
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005256
Tim Peters5bd2a792003-02-01 16:45:06 +00005257/* load(fileobj). */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005258static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005259cpm_load(PyObject *self, PyObject *ob)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005260{
5261 Unpicklerobject *unpickler = 0;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005262 PyObject *res = NULL;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005263
Tim Peterscba30e22003-02-01 06:24:36 +00005264 if (!( unpickler = newUnpicklerobject(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005265 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005266
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005267 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005268
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005269 finally:
5270 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005271
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005272 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005273}
5274
5275
Tim Peters5bd2a792003-02-01 16:45:06 +00005276/* loads(string) */
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005277static PyObject *
Tim Peterscba30e22003-02-01 06:24:36 +00005278cpm_loads(PyObject *self, PyObject *args)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005279{
5280 PyObject *ob, *file = 0, *res = NULL;
5281 Unpicklerobject *unpickler = 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005282
Tim Peterscba30e22003-02-01 06:24:36 +00005283 if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005284 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005285
Tim Peterscba30e22003-02-01 06:24:36 +00005286 if (!( file = PycStringIO->NewInput(ob)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005287 goto finally;
Tim Peters84e87f32001-03-17 04:50:51 +00005288
Tim Peterscba30e22003-02-01 06:24:36 +00005289 if (!( unpickler = newUnpicklerobject(file)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005290 goto finally;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005291
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005292 res = load(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005293
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005294 finally:
5295 Py_XDECREF(file);
5296 Py_XDECREF(unpickler);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005297
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005298 return res;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005299}
5300
5301
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005302PyDoc_STRVAR(Unpicklertype__doc__,
5303"Objects that know how to unpickle");
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005304
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005305static PyTypeObject Unpicklertype = {
5306 PyObject_HEAD_INIT(NULL)
Jeremy Hylton7b5ce7f2003-04-09 21:25:30 +00005307 0, /*ob_size*/
5308 "cPickle.Unpickler", /*tp_name*/
5309 sizeof(Unpicklerobject), /*tp_basicsize*/
5310 0,
5311 (destructor)Unpickler_dealloc, /* tp_dealloc */
5312 0, /* tp_print */
5313 (getattrfunc)Unpickler_getattr, /* tp_getattr */
5314 (setattrfunc)Unpickler_setattr, /* tp_setattr */
5315 0, /* tp_compare */
5316 0, /* tp_repr */
5317 0, /* tp_as_number */
5318 0, /* tp_as_sequence */
5319 0, /* tp_as_mapping */
5320 0, /* tp_hash */
5321 0, /* tp_call */
5322 0, /* tp_str */
5323 0, /* tp_getattro */
5324 0, /* tp_setattro */
5325 0, /* tp_as_buffer */
5326 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
5327 Unpicklertype__doc__, /* tp_doc */
5328 (traverseproc)Unpickler_traverse, /* tp_traverse */
5329 (inquiry)Unpickler_clear, /* tp_clear */
Guido van Rossum9716aaa1997-12-08 15:15:16 +00005330};
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005331
Guido van Rossum60456fd1997-04-09 17:36:32 +00005332static struct PyMethodDef cPickle_methods[] = {
Martin v. Löwis544f1192004-07-27 05:22:33 +00005333 {"dump", (PyCFunction)cpm_dump, METH_VARARGS | METH_KEYWORDS,
5334 PyDoc_STR("dump(obj, file, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005335 "Write an object in pickle format to the given file.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005336 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005337 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005338 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005339
Martin v. Löwis544f1192004-07-27 05:22:33 +00005340 {"dumps", (PyCFunction)cpm_dumps, METH_VARARGS | METH_KEYWORDS,
5341 PyDoc_STR("dumps(obj, protocol=0) -- "
Tim Peters5bd2a792003-02-01 16:45:06 +00005342 "Return a string containing an object in pickle format.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005343 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005344 "See the Pickler docstring for the meaning of optional argument proto.")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005345 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005346
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005347 {"load", (PyCFunction)cpm_load, METH_O,
Neal Norwitz200788c2002-08-13 22:20:41 +00005348 PyDoc_STR("load(file) -- Load a pickle from the given file")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005349
Neal Norwitzb0493252002-03-31 14:44:22 +00005350 {"loads", (PyCFunction)cpm_loads, METH_VARARGS,
Neal Norwitz200788c2002-08-13 22:20:41 +00005351 PyDoc_STR("loads(string) -- Load a pickle from the given string")},
Tim Peters5bd2a792003-02-01 16:45:06 +00005352
Martin v. Löwis544f1192004-07-27 05:22:33 +00005353 {"Pickler", (PyCFunction)get_Pickler, METH_VARARGS | METH_KEYWORDS,
5354 PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005355 "\n"
Tim Peters5bd2a792003-02-01 16:45:06 +00005356 "This takes a file-like object for writing a pickle data stream.\n"
5357 "The optional proto argument tells the pickler to use the given\n"
5358 "protocol; supported protocols are 0, 1, 2. The default\n"
5359 "protocol is 0, to be backwards compatible. (Protocol 0 is the\n"
5360 "only protocol that can be written to a file opened in text\n"
5361 "mode and read back successfully. When using a protocol higher\n"
5362 "than 0, make sure the file is opened in binary mode, both when\n"
5363 "pickling and unpickling.)\n"
5364 "\n"
5365 "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"
5366 "more efficient than protocol 1.\n"
5367 "\n"
5368 "Specifying a negative protocol version selects the highest\n"
5369 "protocol version supported. The higher the protocol used, the\n"
5370 "more recent the version of Python needed to read the pickle\n"
5371 "produced.\n"
5372 "\n"
5373 "The file parameter must have a write() method that accepts a single\n"
5374 "string argument. It can thus be an open file object, a StringIO\n"
5375 "object, or any other custom object that meets this interface.\n")
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005376 },
Tim Peters5bd2a792003-02-01 16:45:06 +00005377
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00005378 {"Unpickler", (PyCFunction)get_Unpickler, METH_O,
Tim Peters5bd2a792003-02-01 16:45:06 +00005379 PyDoc_STR("Unpickler(file) -- Create an unpickler.")},
5380
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005381 { NULL, NULL }
5382};
5383
Guido van Rossum60456fd1997-04-09 17:36:32 +00005384static int
Tim Peterscba30e22003-02-01 06:24:36 +00005385init_stuff(PyObject *module_dict)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005386{
5387 PyObject *copy_reg, *t, *r;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005388
Martin v. Löwis43c9d8a2002-04-01 12:34:33 +00005389#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S))) return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005390
Tim Peters3cfe7542003-05-21 21:29:48 +00005391 if (PyType_Ready(&Unpicklertype) < 0)
5392 return -1;
5393 if (PyType_Ready(&Picklertype) < 0)
5394 return -1;
5395
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005396 INIT_STR(__class__);
5397 INIT_STR(__getinitargs__);
5398 INIT_STR(__dict__);
5399 INIT_STR(__getstate__);
5400 INIT_STR(__setstate__);
5401 INIT_STR(__name__);
5402 INIT_STR(__main__);
5403 INIT_STR(__reduce__);
Guido van Rossumb289b872003-02-19 01:45:13 +00005404 INIT_STR(__reduce_ex__);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005405 INIT_STR(write);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005406 INIT_STR(append);
5407 INIT_STR(read);
5408 INIT_STR(readline);
5409 INIT_STR(copy_reg);
5410 INIT_STR(dispatch_table);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005411
Tim Peterscba30e22003-02-01 06:24:36 +00005412 if (!( copy_reg = PyImport_ImportModule("copy_reg")))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005413 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005414
Tim Peters1f1b2d22003-02-01 02:16:37 +00005415 /* This is special because we want to use a different
5416 one in restricted mode. */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005417 dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
Tim Peters5b7da392003-02-04 00:21:07 +00005418 if (!dispatch_table) return -1;
5419
5420 extension_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005421 "_extension_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005422 if (!extension_registry) return -1;
5423
5424 inverted_registry = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005425 "_inverted_registry");
Tim Peters5b7da392003-02-04 00:21:07 +00005426 if (!inverted_registry) return -1;
5427
5428 extension_cache = PyObject_GetAttrString(copy_reg,
Guido van Rossumd4b920c2003-02-04 01:54:49 +00005429 "_extension_cache");
Tim Peters5b7da392003-02-04 00:21:07 +00005430 if (!extension_cache) return -1;
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005431
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005432 Py_DECREF(copy_reg);
Guido van Rossum60456fd1997-04-09 17:36:32 +00005433
Tim Peters731098b2003-02-04 20:56:09 +00005434 if (!(empty_tuple = PyTuple_New(0)))
5435 return -1;
5436
5437 two_tuple = PyTuple_New(2);
5438 if (two_tuple == NULL)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005439 return -1;
Tim Peters3e667d52003-02-04 21:47:44 +00005440 /* We use this temp container with no regard to refcounts, or to
5441 * keeping containees alive. Exempt from GC, because we don't
5442 * want anything looking at two_tuple() by magic.
5443 */
5444 PyObject_GC_UnTrack(two_tuple);
Guido van Rossumfdde96c1997-12-04 01:13:01 +00005445
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005446 /* Ugh */
5447 if (!( t=PyImport_ImportModule("__builtin__"))) return -1;
5448 if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)
5449 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005450
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005451 if (!( t=PyDict_New())) return -1;
5452 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005453 "def __str__(self):\n"
5454 " return self.args and ('%s' % self.args[0]) or '(what)'\n",
5455 Py_file_input,
5456 module_dict, t) )) return -1;
5457 Py_DECREF(r);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005458
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005459 PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);
Tim Peterscba30e22003-02-01 06:24:36 +00005460 if (!PickleError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005461 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005462
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005463 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005464
Tim Peterscba30e22003-02-01 06:24:36 +00005465 PicklingError = PyErr_NewException("cPickle.PicklingError",
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005466 PickleError, NULL);
Tim Peterscba30e22003-02-01 06:24:36 +00005467 if (!PicklingError)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005468 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005469
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005470 if (!( t=PyDict_New())) return -1;
5471 if (!( r=PyRun_String(
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005472 "def __str__(self):\n"
5473 " a=self.args\n"
5474 " a=a and type(a[0]) or '(what)'\n"
5475 " return 'Cannot pickle %s objects' % a\n"
5476 , Py_file_input,
5477 module_dict, t) )) return -1;
5478 Py_DECREF(r);
Tim Peters84e87f32001-03-17 04:50:51 +00005479
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005480 if (!( UnpickleableError = PyErr_NewException(
Tim Peterscba30e22003-02-01 06:24:36 +00005481 "cPickle.UnpickleableError", PicklingError, t)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005482 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005483
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005484 Py_DECREF(t);
Guido van Rossumc03158b1999-06-09 15:23:31 +00005485
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005486 if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",
Tim Peterscba30e22003-02-01 06:24:36 +00005487 PickleError, NULL)))
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005488 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005489
Martin v. Löwis658009a2002-09-16 17:26:24 +00005490 if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",
5491 UnpicklingError, NULL)))
5492 return -1;
Tim Peterscba30e22003-02-01 06:24:36 +00005493
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005494 if (PyDict_SetItemString(module_dict, "PickleError",
5495 PickleError) < 0)
5496 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005497
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005498 if (PyDict_SetItemString(module_dict, "PicklingError",
5499 PicklingError) < 0)
5500 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005501
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005502 if (PyDict_SetItemString(module_dict, "UnpicklingError",
5503 UnpicklingError) < 0)
5504 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005505
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005506 if (PyDict_SetItemString(module_dict, "UnpickleableError",
5507 UnpickleableError) < 0)
5508 return -1;
Guido van Rossum60456fd1997-04-09 17:36:32 +00005509
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005510 if (PyDict_SetItemString(module_dict, "BadPickleGet",
5511 BadPickleGet) < 0)
5512 return -1;
Guido van Rossumc03158b1999-06-09 15:23:31 +00005513
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005514 PycString_IMPORT;
Guido van Rossum053b8df1998-11-25 16:18:00 +00005515
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005516 return 0;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005517}
5518
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005519#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
5520#define PyMODINIT_FUNC void
Guido van Rossumf9ffb031999-02-04 14:54:04 +00005521#endif
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005522PyMODINIT_FUNC
Tim Peterscba30e22003-02-01 06:24:36 +00005523initcPickle(void)
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005524{
5525 PyObject *m, *d, *di, *v, *k;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005526 Py_ssize_t i;
Tim Peters5b7da392003-02-04 00:21:07 +00005527 char *rev = "1.71"; /* XXX when does this change? */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005528 PyObject *format_version;
5529 PyObject *compatible_formats;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005530
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005531 Picklertype.ob_type = &PyType_Type;
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005532 Unpicklertype.ob_type = &PyType_Type;
5533 PdataType.ob_type = &PyType_Type;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005534
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005535 /* Initialize some pieces. We need to do this before module creation,
Tim Peters5b7da392003-02-04 00:21:07 +00005536 * so we're forced to use a temporary dictionary. :(
5537 */
5538 di = PyDict_New();
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005539 if (!di) return;
5540 if (init_stuff(di) < 0) return;
Guido van Rossumebba4202000-09-07 14:35:37 +00005541
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005542 /* Create the module and add the functions */
5543 m = Py_InitModule4("cPickle", cPickle_methods,
5544 cPickle_module_documentation,
5545 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00005546 if (m == NULL)
5547 return;
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005548
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005549 /* Add some symbolic constants to the module */
5550 d = PyModule_GetDict(m);
Tim Peters5b7da392003-02-04 00:21:07 +00005551 v = PyString_FromString(rev);
5552 PyDict_SetItemString(d, "__version__", v);
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005553 Py_XDECREF(v);
Barry Warsaw93d29b61997-01-14 17:45:08 +00005554
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005555 /* Copy data from di. Waaa. */
5556 for (i=0; PyDict_Next(di, &i, &k, &v); ) {
5557 if (PyObject_SetItem(d, k, v) < 0) {
5558 Py_DECREF(di);
5559 return;
5560 }
5561 }
5562 Py_DECREF(di);
Guido van Rossumebba4202000-09-07 14:35:37 +00005563
Tim Peters8587b3c2003-02-13 15:44:41 +00005564 i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);
5565 if (i < 0)
5566 return;
5567
Tim Peters5b7da392003-02-04 00:21:07 +00005568 /* These are purely informational; no code uses them. */
5569 /* File format version we write. */
5570 format_version = PyString_FromString("2.0");
5571 /* Format versions we can read. */
5572 compatible_formats = Py_BuildValue("[sssss]",
5573 "1.0", /* Original protocol 0 */
5574 "1.1", /* Protocol 0 + INST */
5575 "1.2", /* Original protocol 1 */
5576 "1.3", /* Protocol 1 + BINFLOAT */
Tim Peters0dd23aa2003-02-04 00:30:46 +00005577 "2.0"); /* Original protocol 2 */
Martin v. Löwis2f6ef4c2002-04-01 17:40:08 +00005578 PyDict_SetItemString(d, "format_version", format_version);
5579 PyDict_SetItemString(d, "compatible_formats", compatible_formats);
5580 Py_XDECREF(format_version);
5581 Py_XDECREF(compatible_formats);
Guido van Rossum2f4caa41997-01-06 22:59:08 +00005582}